我有一个如下数据框:
>>> df1
a b
0 [1, 2, 3] 10
1 [4, 5, 6] 20
2 [7, 8] 30
和另一个类似:
>>> df2
a
0 1
1 2
2 3
3 4
4 5
如果df2的列'a'值位于行列'a'df1中,则需要从df1的列'b'中创建df2列'c'。在df1中,列“ a”的每个元组都是一个列表。
我尝试通过以下网址实施,但到目前为止没有任何帮助: https://medium.com/@Imaadmkhan1/using-pandas-to-create-a-conditional-column-by-selecting-multiple-columns-in-two-different-b50886fabb7d
预期结果是
>>> df2
a c
0 1 10
1 2 10
2 3 10
3 4 20
4 5 20
答案 0 :(得分:4)
使用:
m=pd.DataFrame({'a':np.concatenate(df.a.values),'b':df.b.repeat(df.a.str.len())})
df2.merge(m,on='a')
a b
0 1 10
1 2 10
2 3 10
3 4 20
4 5 20
答案 1 :(得分:4)
通过将df1
的值展平到字典来使用Series.map
:
d = {c: b for a, b in zip(df1['a'], df1['b']) for c in a}
print (d)
{1: 10, 2: 10, 3: 10, 4: 20, 5: 20, 6: 20, 7: 30, 8: 30}
df2['new'] = df2['a'].map(d)
print (df2)
a new
0 1 10
1 2 10
2 3 10
3 4 20
4 5 20
编辑:我认为问题是a
列中列表中的混合整数,解决方案是使用if / else测试新字典:
d = {}
for a, b in zip(df1['a'], df1['b']):
if isinstance(a, list):
for c in a:
d[c] = b
else:
d[a] = b
df2['new'] = df2['a'].map(d)
答案 2 :(得分:2)
首先我们将列表df1 unnest
行,然后将它们合并到列a
上:
df1 = df1.set_index('b').a.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'a'})
print(df1, '\n')
df_final = df2.merge(df1, on='a')
print(df_final)
b a
0 10 1.0
1 10 2.0
2 10 3.0
0 20 4.0
1 20 5.0
2 20 6.0
0 30 7.0
1 30 8.0
a b
0 1 10
1 2 10
2 3 10
3 4 20
4 5 20