![](/img/trans.png)
[英]Assign value to a column based of other columns from the same pandas dataframe
[英]Pandas dataframe assign value to lists based on other columns
我有一个这样的 dataframe:
id cola colb
0 0 0 [1]
1 1 1 [2,3,4]
2 1 2 [2,3,4]
3 2 3 [3]
4 2 4 [3]
5 2 5 [4]
6 3 6 [5]
...
并希望它转换为:
id cola colb colc
0 0 0 [1]
1 1 1 [2,3,4] 0
2 1 2 [2,3,4] 0
3 2 3 [3] 1,2
4 2 4 [3] 1,2
5 2 5 [4] 1,2
6 3 6 [5] 1,2,3,4
...
规则是:
以第一行为例,colb=[1],对应cola=0,则cola=0 追加到id=[1]的colc 单元格列表中。
以第二行为例,colb=[2,3,4],对应cola=1,则将cola=1追加到id=[2,3,4]的colc单元格列表中。
以第三行为例,colb=[2,3,4],对应cola=2,则将cola=2追加到colc中的cell list for id=[2,3,4]。 ...
到目前为止,这是我尝试过的:
df['colc'] = [[] for _ in range(len(df))]
for i in range(len(df['colb'])):
lista = df.colb[i]
for j in lista:
df.colc.loc[df.id==j].append(pd.Series(df.cola[i]))
但似乎df.colc.loc[df.id==j]
问题,列表中没有附加任何值。 有没有办法做到这一点? 有人能这么好心帮助我吗? 谢谢!
df = pd.DataFrame({
'id': [0,1,1,2,2,2,3],
'cola': [0,1,2,3,4,5,6],
'colb': [[1], [2,3,4], [2,3,4], [3], [3], [4], [5]],
})
colb
是id
列表的一列, cola
是我们用来形成colc
的,所以我们可以挑选出那些列,重命名它们,然后分解重命名的id
列,这样所有列表都分解成行。 展开的行之前将共享相同的colc
值。
step1 = df[['colb', 'cola']].rename(columns={'colb': 'id', 'cola': 'colc'}).explode('id')
然后我们可以groupby
形成不同id
的列表
step2 = step1.groupby('id')['colc'].apply(list)
最后将这些列表合并回来
df.merge(step2, on='id', how='left')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.