GVKun编程网logo

仅将一个键列复制到合并的DataFrame中(dataframe复制某一列)

18

如果您对仅将一个键列复制到合并的DataFrame中和dataframe复制某一列感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解仅将一个键列复制到合并的DataFrame中的各种细节,并对da

如果您对仅将一个键列复制到合并的DataFrame中dataframe复制某一列感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解仅将一个键列复制到合并的DataFrame中的各种细节,并对dataframe复制某一列进行深入的分析,此外还有关于data.table join然后将列添加到现有的data.frame中,无需重新复制、dataframe中将一列数据切分成多列、Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe、Pandas DataFrame使用另一个DataFrame列过滤行的实用技巧。

本文目录一览:

仅将一个键列复制到合并的DataFrame中(dataframe复制某一列)

仅将一个键列复制到合并的DataFrame中(dataframe复制某一列)

考虑以下数据帧:

df1 = pd.DataFrame({''a'': [0, 1, 2, 3], ''b'': list(''abcd'')})df2 = pd.DataFrame({''c'': list(''abcd''), ''d'': ''Alex''})

在这种情况下,df1[''b'']df2[''c'']是关键列。因此,合并时:

df1.merge(df2, left_on=''b'', right_on=''c'')   a  b  c     d0  0  a  a  Alex1  1  b  b  Alex2  2  c  c  Alex3  3  d  d  Alex

当我只需要一个时,我在结果DataFrame中得到两个关键列。我一直在使用:

df1.merge(df2, left_on=''b'', right_on=''c'').drop(''c'', axis=''columns'')

有没有办法只保留一个关键列?

答案1

小编典典

一种方法是分别设置bc作为帧的索引,并使用join后跟reset_index

df1.set_index(''b'').join(df2.set_index(''c'')).reset_index()   b  a     d0  a  0  Alex1  b  1  Alex2  c  2  Alex3  d  3  Alex

这将比merge/drop大数据帧上的方法快,主要是因为drop它很慢。@Bill的方法比我的建议快,而@WB和@PiRsquared轻松超越了其他建议:

import timeitdf1 = pd.concat((df1 for _ in range(1000)))df2 = pd.concat((df2 for _ in range(1000)))def index_method(df1 = df1, df2 = df2):    return df1.set_index(''b'').join(df2.set_index(''c'')).reset_index()def merge_method(df1 = df1, df2=df2):    return df1.merge(df2, left_on=''b'', right_on=''c'').drop(''c'', axis=''columns'')def rename_method(df1 = df1, df2 = df2):    return df1.rename({''b'': ''c''}, axis=1).merge(df2)def index_method2(df1 = df1, df2 = df2):    return df1.join(df2.set_index(''c''), on=''b'')def assign_method(df1 = df1, df2 = df2):    return df1.set_index(''b'').assign(c=df2.set_index(''c'').d).reset_index()def map_method(df1 = df1, df2 = df2):    return df1.assign(d=df1.b.map(dict(df2.values)))>>> timeit.timeit(index_method, number=10) / 100.7853091600998596>>> timeit.timeit(merge_method, number=10) / 101.1696729859002517>>> timeit.timeit(rename_method, number=10) / 100.4291436871004407>>> timeit.timeit(index_method2, number=10) / 100.5037374985004135>>> timeit.timeit(assign_method, number=10) / 100.0038641377999738325>>> timeit.timeit(map_method, number=10) / 100.006620216699957382

data.table join然后将列添加到现有的data.frame中,无需重新复制

data.table join然后将列添加到现有的data.frame中,无需重新复制

我有两个data.tables,X(3m行〜500列)和Y(100行两列).
set.seed(1)
X <- data.table( a=letters,b=letters,c=letters,g=sample(c(1:5,7),length(letters),replace=TRUE),key="g" )
Y <- data.table( z=runif(6),g=1:6,key="g" )

我想在X上做一个左外连接,我可以通过Y [X]来做:谢谢:

Why does X[Y] join of data.tables not allow a full outer join,or a left join?

但是我想将新的列添加到X,而不复制X(因为它是巨大的).

显然,像X< - Y [X]这样的东西是有效的,但是除非数据表远比我给予它更多的信任(而且我给予它很多的诡计!),我相信这将复制整个X. X [,z:= Y [X,z] $z]工作,但是是kludgy,并且不能很好地扩展到多列. 如何将合并的结果存储在保留的data.table文件中,以有效的方式(无论是在副本还是在程序员时间方面)?

解决方法

这很容易做到:
X[Y,z := i.z]

它的工作原理是因为Y [X]和X [Y]之间的唯一区别是当某些元素不在Y中时,在这种情况下,大概您希望z为NA,上述赋值将完全正确.

它也将适用于许多变量:

X[Y,`:=`(z1 = i.z1,z2 = i.z2,...)]

由于您需要操作Y [X],您可以添加参数nomatch = 0(作为@mnel指出),以便对于X不包含Y的键值的那些,不能获得NAs.即:

X[Y,z := i.z,nomatch=0]

从NEWS for data.table

06003

NEW FEATURES

06004

dataframe中将一列数据切分成多列

dataframe中将一列数据切分成多列

原sheet中数据

原来的dataframe

目的

将【备注】列切分成【key】列和【value】列

Python

sheet[''key''] = sheet[''备注''].str.extract(r''(_.*(?=\u503c))'')
sheet[''value''] = sheet[''备注''].str.extract(r''((?<==).*)'')

结果

处理后的dataframe

参考

  • pandas.Series.str.extract

Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe

Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe

我能够使用下面的方法获得所需的输出

df1.merge(df2,left_on = df2.prod_ref.str.extract(''(\d+)'',expand = False),right_on = df1.prod_id.str.extract(''(\d+)'',how = ''left'')

Pandas DataFrame使用另一个DataFrame列过滤行

Pandas DataFrame使用另一个DataFrame列过滤行

我会做merge

out = df1.merge(df2[['col1','col2']],on = 'col1',suffixes = ('','1')).query('col3>=col21').drop('col21',1)

out
Out[15]: 
  col1  col2  col3  col4
1    A     2  0.80   200
2    A     2  0.90   300
3    A     3  0.95   400
4    A     3  0.85   500
5    B     2  0.65   600
6    B     2  0.75   700
9    B     3  0.75  1000

reindex

out = df1[df1['col3'] >= df2.set_index('col1')['col2'].reindex(df1['col1']).values]
Out[19]: 
  col1  col2  col3  col4
1    A     2  0.80   200
2    A     2  0.90   300
3    A     3  0.95   400
4    A     3  0.85   500
5    B     2  0.65   600
6    B     2  0.75   700
9    B     3  0.75  1000

您还可以使用map

 df1.loc[df1.col3 >= df1.col1.map(df2.set_index("col1").col2)]
,

我的方法类似于@Ben_Yo的合并答案,但是代码更多,但也许更直接。

您只需:

  1. 合并该列并创建新的数据框 ZStack{ Rectangle() .frame(width: geometry.size.width,height: geometry.size.height/3.25) .shadow(radius: 5) .foregroundColor(Color.white) //Words ontop of the Rectangle VStack { HStack { Spacer() Text("Hello World") }.padding(.trailing,40) Spacer() //<-- PROBLEM HERE }//.offset(y: -40) }
  2. 根据条件(在本例中为s
  3. ),将数据名人s更改为返回TrueFalse的布尔系列。
  4. 最后,将s['col3'] >= s['col2']传递给s,结果将排除布尔系列df1中返回False的行:

s

我们今天的关于仅将一个键列复制到合并的DataFrame中dataframe复制某一列的分享就到这里,谢谢您的阅读,如果想了解更多关于data.table join然后将列添加到现有的data.frame中,无需重新复制、dataframe中将一列数据切分成多列、Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe、Pandas DataFrame使用另一个DataFrame列过滤行的相关信息,可以在本站进行搜索。

本文标签: