python - 如何创建一个新的 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)
而我正在寻找保留所有行并在新列中生成每个列表而不包含行值的东西。
感谢您的任何帮助!!
解决方案
我们可以在 eachexplode
中groupby
创建整体,然后进行sublist
index
set
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
推荐阅读
- php - 使用 htaccess 更改动态 url 的问题
- github - 无法通过 API 向分叉存储库发送提交
- azure-data-factory - 管道上传在 Sink 端失败并带有神秘的错误消息
- maven - 在我的 Web 服务器上创建自定义 Maven 存储库
- java - 当我们将应用程序部署为war文件时如何在itext 7转换器属性中设置baseUri
- javascript - 突破代码不起作用。不知道如何做数组
- c++ - 这是存储浮点数的二维动态数组的正确初始化吗?
- sql - 拆分日期范围中的总 datediff 天数不等于非拆分日期范围中的 datediff 天数,为什么?
- c# - 如何修复播放模式后检查器中缺少的音频按钮?
- google-bigquery - BigQuery 中的 Firebase 数据,什么是“stream_id”?