我正在尝试遍历包含多个列表的数据框列,并控制列表中的值是否由另一个数据框列所包含。
我是python的新手,现在已经有较长时间了。我已经尝试过用isin
和str.contains
解决此问题的方法,但是我仍然找不到匹配的对象。
这是到目前为止我制定的代码:
data = [['yellow', 10,0], ['red', 15,0], ['blue', 14,0]]
df1 = pd.DataFrame(data, columns = ['Colour', 'Colour_id','Amount'])
df1
Colour Colour_id Amount
yellow 10 0
red 15 0
blue 14 0
data = [['tom',[10,15],200 ], ['adam', [10],50], ['john',[15,14],200]]
df2 = pd.DataFrame(data, columns = ['Colour', 'Colour_id','Amount'])
df2
Name Colour_id Amount
tom [10,15] 200
adam [10] 50
john [15,14] 200
for indices, row in df2.iterrows():
for i in row['Colour_id']:
if i in df1['Colour_id']:
df1['Amount']=df1['Amount']=df2['Amount']
else:
print("No")
预期结果应该是df1的“金额”列被填充为:
Colour Colour_id Amount
yellow 10 250
red 15 400
blue 14 200
此刻,我仅获得else条件的“否”。
答案 0 :(得分:0)
通过将列表列转换为DataFrame
,通过stack
重塑并聚合sum
和Series.map
来创建序列的想法:
df3 = pd.DataFrame(df2['Colour_id'].values.tolist(), index=df2['Amount']).stack().reset_index()
s = df3.groupby(0)['Amount'].sum()
df1['Amount'] = df1['Colour_id'].map(s)
print (df1)
Colour Colour_id Amount
0 yellow 10 250
1 red 15 400
2 blue 14 200
或者将defaultdict
与纯python fo字典结合使用,将值求和,并将map
用于新列:
from collections import defaultdict
d = defaultdict(int)
for cid, Amount in zip(df2['Colour_id'], df2['Amount']):
for x in cid:
d[x] += Amount
print (d)
defaultdict(<class 'int'>, {10: 250, 15: 400, 14: 200})
df1['Amount'] = df1['Colour_id'].map(s)
print (df1)
Colour Colour_id Amount
0 yellow 10 250
1 red 15 400
2 blue 14 200