如何创建一个新的 pandas 列,该列是索引范围中每个值的列表,不包括行值
Posted
技术标签:
【中文标题】如何创建一个新的 pandas 列,该列是索引范围中每个值的列表,不包括行值【英文标题】:How to make a new pandas column that is a list of every value in an index range not including the row value 【发布时间】:2020-09-16 10:51:12 【问题描述】:我想知道是否可以在 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)
而我正在寻找保留所有行并在新列中生成每个列表而不包含行值的东西。
感谢您的帮助!!
【问题讨论】:
【参考方案1】:我们可以用groupby
做explode
在每个index
中创建整个list
,然后做set
sub
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
【讨论】:
感谢您的精彩回答!如果 a 在多行中重复,我们只想摆脱其中的一个,而不是全部,怎么样?如果我们有 d = 'index': [1, 1, 1, 2, 2, 3], 'col1': ['a', 'a', 'c', 'd', 'e, f' , 'g'],这意味着列表列将删除两个“a”值,但如果有办法只从该行中删除一个? 那么我的意思是,是否可以只删除第一个副本?对于第 4 行,如果我们有一个重复的 "e, f",我们是否能够从 [e, f, e, f, d] 中只删除一个 e, f? @FrankMank1 这很难,你需要用 remove 做 for 循环 当然!您能否解释一下为什么使用 x = x.copy() 和 y = y.copy() 而不是值本身? @FrankMank1 我们需要复制,因为如果不是,输出将为空,因为删除是从数据框***.com/questions/2612802/how-to-clone-or-copy-a-list中删除对象以上是关于如何创建一个新的 pandas 列,该列是索引范围中每个值的列表,不包括行值的主要内容,如果未能解决你的问题,请参考以下文章