Python 仅当行和列值相同时才添加两个数据帧值
我有两个大小不同的数据帧,其中一个比另一个大,但第二个数据帧有更多的列 如果一个数据框的列和行值与另一个数据框的列和行值相同(在本例中为id),则尝试添加该数据框时会遇到问题 这是一些虚拟数据,我是如何试图解决它的Python 仅当行和列值相同时才添加两个数据帧值,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个大小不同的数据帧,其中一个比另一个大,但第二个数据帧有更多的列 如果一个数据框的列和行值与另一个数据框的列和行值相同(在本例中为id),则尝试添加该数据框时会遇到问题 这是一些虚拟数据,我是如何试图解决它的 import pandas as pd df1 = pd.DataFrame([(1,2,3),(3,4,5),(5,6,7),(7,8,9),(100,10,12),(100,10,12),(100,10,12)], columns=['id','value','c']) df2
import pandas as pd
df1 = pd.DataFrame([(1,2,3),(3,4,5),(5,6,7),(7,8,9),(100,10,12),(100,10,12),(100,10,12)], columns=['id','value','c'])
df2 = pd.DataFrame([(1,200,3,4,6),(3,400,3,4,6),(5,600,3,4,6),(5,620,3,4,6)], columns=['id','value','x','y','z'])
因此,如果df1
和df2
的id相同,则通过“whatToAdd”中的值添加列值
资料
预期:
Out:
id value x y z
1 202 3 4 6
3 404 3 4 6
5 606 3 4 6
5 626 3 4 6
尝试:
for each in df1.a:
if(df2.loc[df2['a'] == each]):
df2['a']+=df['a']
抛出错误“数据帧的真值不明确。请使用a.empty、a.bool()、a.item()、a.any()或a.all()。”这让我感到困惑,因为我尝试了:
df2.loc[df2['a']==1
跳出循环并工作您可以使用
设置索引
和添加
,然后使用重新索引
df1.set_index('id').add(df2.set_index('id'),fill_value=0).dropna(axis=0).reset_index().reindex(columns=df2.columns)
Out[193]:
id value x y z
0 1 202.0 3.0 4.0 6.0
1 3 404.0 3.0 4.0 6.0
2 5 606.0 3.0 4.0 6.0
3 5 626.0 3.0 4.0 6.0
将两个数据帧设置为具有相同索引后:
df1 = df1.set_index("id")
df2 = df2.set_index("id")
您可以执行一个非常简单的操作:
mask = df1.index.isin(df2.index)
df2["value"] += df1.loc[mask, "value"]
输出:
value x y z
id
1 202 3 4 6
3 404 3 4 6
5 606 3 4 6
5 626 3 4 6
您可以随时执行
df2.reset_index()
以返回原始设置。以下是我提出的代码。它使用dict查找df1中每个id的值。然后可以使用Map查找df2中每个id的值,创建一个序列,然后将该序列添加到df2['value'],以生成所需的结果
df1_lookup = dict(df1.set_index('id')['value'].items())
df2['value'] += df2['id'].map(lambda x: df1_lookup.get(x, 0))
这是一条单行线
df2.loc[:, 'value'] += [df1.set_index('id').loc[i, 'value'] for i in df2.id]
print(df2)
>>>
id value x y z
0 1 202 3 4 6
1 3 404 3 4 6
2 5 606 3 4 6
3 5 626 3 4 6
您的示例中的c列是什么?@Sören根本不使用它,只是在那里用于虚拟,因此它与我的真实数据环境类似:)
df2.loc[:, 'value'] += [df1.set_index('id').loc[i, 'value'] for i in df2.id]
print(df2)
>>>
id value x y z
0 1 202 3 4 6
1 3 404 3 4 6
2 5 606 3 4 6
3 5 626 3 4 6