首页 > 解决方案 > 如何创建一个新的 pandas 列,该列是索引范围内每个值的列表,不包括行值

问题描述

我想知道是否可以在 pandas 数据框中创建一个新列,该列是每个值的列表,不包括行本身的值。例如,在下面的 df 中,我有“list”列中的第一行值 [b,c],以及行本身的值“a”。每个索引都可以这样做吗?

我试过这个,但它返回每个索引组合的所有值的列表:

import pandas as pd 
d = {'index': [1, 1, 1, 2, 2, 3], 'col1': ['a', 'b', 'c', 'd', 'e, f', 'g']}
df = pd.DataFrame(d)
df = df.groupby("index")["col1"].apply(list)

而我正在寻找保留所有行并在新列中生成每个列表而不包含行值的东西。

在此处输入图像描述

感谢您的任何帮助!!

标签: pythonpandaslistdataframeindexing

解决方案


我们可以在 eachexplodegroupby创建整体,然后进行sublistindexset

df['l']=df.col1.str.split(',')
df['new']=df.explode('l').groupby('index')['l'].agg(list).reindex(df['index']).tolist()
df['List']=(df.new.apply(set)-df['l'].apply(set)).apply(list)
df.loc[~df.List.astype(bool),'List']=df.l
df
   index  col1        l         new     List
0      1     a      [a]   [a, b, c]   [c, b]
1      1     b      [b]   [a, b, c]   [a, c]
2      1     c      [c]   [a, b, c]   [a, b]
3      2     d      [d]  [d, e,  f]  [e,  f]
4      2  e, f  [e,  f]  [d, e,  f]      [d]
5      3     g      [g]         [g]      [g]

更新

l=[]
... for x , y in zip(df.l,df.new):
...     x=x.copy()
...     y=y.copy()
...     for i in x:
...         if i in y:
...             y.remove(i)
...     l.append(y)
... 
l
[['b', 'c'], ['a', 'c'], ['a', 'b'], ['e', ' f'], ['d'], []]
df['List']=l

推荐阅读