如果您对仅将一个键列复制到合并的DataFrame中和dataframe复制某一列感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解仅将一个键列复制到合并的DataFrame中的各种细节,并对da
如果您对仅将一个键列复制到合并的DataFrame中和dataframe复制某一列感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解仅将一个键列复制到合并的DataFrame中的各种细节,并对dataframe复制某一列进行深入的分析,此外还有关于data.table join然后将列添加到现有的data.frame中,无需重新复制、dataframe中将一列数据切分成多列、Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe、Pandas DataFrame使用另一个DataFrame列过滤行的实用技巧。
本文目录一览:- 仅将一个键列复制到合并的DataFrame中(dataframe复制某一列)
- data.table join然后将列添加到现有的data.frame中,无需重新复制
- dataframe中将一列数据切分成多列
- Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe
- Pandas 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
小编典典一种方法是分别设置b
和c
作为帧的索引,并使用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中,无需重新复制
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中将一列数据切分成多列
原sheet中数据
目的
将【备注】列切分成【key】列和【value】列
Python
sheet[''key''] = sheet[''备注''].str.extract(r''(_.*(?=\u503c))'')
sheet[''value''] = sheet[''备注''].str.extract(r''((?<==).*)'')
结果
参考
- pandas.Series.str.extract
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列过滤行
我会做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的合并答案,但是代码更多,但也许更直接。
您只需:
- 合并该列并创建新的数据框
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) }
- 根据条件(在本例中为
s
),将数据名人 - 最后,将
s['col3'] >= s['col2']
传递给s
,结果将排除布尔系列df1
中返回False
的行:
s
更改为返回True
或False
的布尔系列。
s
我们今天的关于仅将一个键列复制到合并的DataFrame中和dataframe复制某一列的分享就到这里,谢谢您的阅读,如果想了解更多关于data.table join然后将列添加到现有的data.frame中,无需重新复制、dataframe中将一列数据切分成多列、Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe、Pandas DataFrame使用另一个DataFrame列过滤行的相关信息,可以在本站进行搜索。
本文标签: