[英]adding two pandas dataframe value only if the row and column value is the same
我有兩個不同大小的數據幀,其中一個比另一個大,但第二個數據幀有更多列。
我在嘗試添加數據幀時遇到問題,如果它與另一個數據幀具有相同的列和行值,在這種情況下是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 = 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”中的值
數據
df1:
id value c
1 2 3
3 4 5
5 6 7
7 8 9
100 10 12
100 10 12
100 10 12
df2:
id value x y z
1 200 3 4 6
3 400 3 4 6
5 600 3 4 6
5 620 3 4 6
預期:
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']
發出錯誤“DataFrame的真值是不明確的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。” 這讓我感到困惑,因為我試過:
df2.loc[df2['a']==1
離開循環,它的工作原理
將兩個數據幀設置為具有相同的索引后:
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()
以恢復原始設置。
您可以將set_index
與add
set_index
使用,然后使用reindex
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
這是我提出的代碼。 它使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.