【问题标题】:Python Pandas copying column from df to another if values same如果值相同,Python Pandas 将列从 df 复制到另一个
【发布时间】:2017-04-19 18:19:33
【问题描述】:

我有两个数据框:

东风一号:

ID     A    B    C
 1     x    y    z
 1     x    y    z
 2     x    y    z
 2     x    y    z
 2     x    y    z
 3     x    y    z

DF 2:

ID     D    E    F
 1     a    b    c1
 2     a    b    c2
 3     a    b    c3

我想以 DF TWO 中的 E 列为例,并将其放在 DF ONE 上,如果 ID 相同,那么在我得到这个输出之后:

ID     A    B    C    F
 1     x    y    z    c1
 1     x    y    z    c1
 2     x    y    z    c2
 2     x    y    z    c2
 2     x    y    z    c2
 3     x    y    z    c3

感谢您的帮助

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

您可以通过dict 使用map

d = df2.set_index('ID')['F'].to_dict()
print (d)
{1: 'c1', 2: 'c2', 3: 'c3'}

df1['F'] = df1['ID'].map(d)
print (df1)
   ID  A  B  C   F
0   1  x  y  z  c1
1   1  x  y  z  c1
2   2  x  y  z  c2
3   2  x  y  z  c2
4   2  x  y  z  c2
5   3  x  y  z  c3

另一个解决方案是map by Series:

s = df2.set_index('ID')['F']
print (s)
ID
1    c1
2    c2
3    c3
Name: F, dtype: object

df1['F'] = df1['ID'].map(s)
print (df1)
   ID  A  B  C   F
0   1  x  y  z  c1
1   1  x  y  z  c1
2   2  x  y  z  c2
3   2  x  y  z  c2
4   2  x  y  z  c2
5   3  x  y  z  c3

时间安排

#[60000 rows x 5 columns]
df1 = pd.concat([df1]*10000).reset_index(drop=True)

In [115]: %timeit pd.merge(df1, df2[['ID', 'F']],how='left')
100 loops, best of 3: 11.1 ms per loop

In [116]: %timeit df1['ID'].map(df2.set_index('ID')['F'])
100 loops, best of 3: 3.18 ms per loop

In [117]: %timeit df1['ID'].map(df2.set_index('ID')['F'].to_dict())
100 loops, best of 3: 3.36 ms per loop

In [118]: %timeit df1['ID'].map({k:v for k, v in df2[['ID', 'F']].as_matrix()})
100 loops, best of 3: 3.44 ms per loop

In [119]: %%timeit 
     ...: df2.index = df2['ID']
     ...: df1['F1'] = df1['ID'].map(df2['F'])
     ...: 
100 loops, best of 3: 3.33 ms per loop

【讨论】:

  • 非常好的时间对比!
  • @MaxU - 谢谢。
【解决方案2】:

你需要从df2创建地图,你可以这样做:

mapping = {k:v for k, v in df2[['ID', 'F']].as_matrix()}

然后将它们应用到df1:

df1['F'] = df1['ID'].map(mapping)

或者你可以使用:

df1 = pd.merge(df1, df2[['ID', 'F']],how='left')

【讨论】:

  • 虽然需要很长时间,但它可以工作。知道如何禁食吗?
  • 嗯,mergemap 慢,请参阅我的回答中的timings
  • 非常好 :) 我一直认为merge 是首选技术,我还记得阅读merge 应该非常快,但时间才是硬道理。
【解决方案3】:

您可以使用map,注意将ID 设置为使用df2.index = df2['ID'] 的数据帧二的索引:

In [10]: df1['F'] = df1['ID'].map(df2['F'])

In [11]: df1
Out[11]: 
   ID  A  B  C   F
0   1  x  y  z  c1
1   1  x  y  z  c1
2   2  x  y  z  c2
3   2  x  y  z  c2
4   2  x  y  z  c2
5   3  x  y  z  c3

【讨论】:

  • 不工作。也许是因为我的数据框中的ID 列不是索引列?
  • 是的,您应该将其设置为第二个数据框中的索引。如果您从 .csv 文件导入,请尝试 pd.read_csv(filename.csv,index_col='ID'),否则使用 df2.index = df2['ID'] 进行设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
相关资源
最近更新 更多