【发布时间】:2019-07-06 03:30:35
【问题描述】:
我有一个简单的数据框 df,其中有一列列表 lists。我想根据lists 生成一个额外的列。
df 看起来像:
import pandas as pd
lists={1:[[1]],2:[[1,2,3]],3:[[2,9,7,9]],4:[[2,7,3,5]]}
#create test dataframe
df=pd.DataFrame.from_dict(lists,orient='index')
df=df.rename(columns={0:'lists'})
df
lists
1 [1]
2 [1, 2, 3]
3 [2, 9, 7, 9]
4 [2, 7, 3, 5]
我希望df 看起来像这样:
df
Out[9]:
lists rolllists
1 [1] [1]
2 [1, 2, 3] [1, 1, 2, 3]
3 [2, 9, 7, 9] [1, 2, 3, 2, 9, 7, 9]
4 [2, 7, 3, 5] [2, 9, 7, 9, 2, 7, 3, 5]
基本上我想对滚动的 2 个列表进行“总和”/append。请注意第 1 行,因为我只有 1 个列表 1,所以 rolllists 就是那个列表。但在第 2 行,我有 2 个要附加的列表。然后对于第三行,附加df[2].lists 和df[3].lists 等。我以前做过类似的事情,参考这个:Pandas Dataframe, Column of lists, Create column of sets of cumulative lists, and record by record differences。
此外,如果我们可以在上面得到这部分,那么我想在groupby 中执行此操作(例如,下面的示例将是 1 组,例如,df 在groupby 中可能看起来像这样):
Group lists rolllists
1 A [1] [1]
2 A [1, 2, 3] [1, 1, 2, 3]
3 A [2, 9, 7, 9] [1, 2, 3, 2, 9, 7, 9]
4 A [2, 7, 3, 5] [2, 9, 7, 9, 2, 7, 3, 5]
5 B [1] [1]
6 B [1, 2, 3] [1, 1, 2, 3]
7 B [2, 9, 7, 9] [1, 2, 3, 2, 9, 7, 9]
8 B [2, 7, 3, 5] [2, 9, 7, 9, 2, 7, 3, 5]
我尝试了各种方法,例如 df.lists.rolling(2).sum(),但出现此错误:
TypeError: cannot handle this type -> object
在 Pandas 0.24.1 中,不幸的是在 Pandas 0.22.0 中,该命令不会出错,而是返回与 lists 中完全相同的值。所以看起来新版本的 Pandas 不能汇总列表?这是次要问题。
喜欢任何帮助!玩得开心!
【问题讨论】:
-
df.lists.cumsum()可以处理列表,但它不会为您提供滚动窗口。像这样组合列表并不是 Pandas 的真正目的...... -
@JoshFriedlander,你能补充一些关于为什么 Pandas 不是为此而构建的细节吗?我发现它对许多类型的列/行数据操作很有用。有很多例子,您存储列表并希望以某种方式组合它们。 Pandas 是为数据操作和时间序列而构建的,数据帧可以保存列表、集合等。事实上 cumsum 可以做到这一点,如果 rolling 可以的话那就太好了。也许是一种取和减去两个偏移累积和的方法?
-
抱歉,这是不正确的,因为列表不是 Pandas 价值观的“一等公民”。请参阅 Jeff Reback 的评论 here。
-
我确实读过。不幸的是,因为列表非常 Pythonic,并且可以处理您需要将数字或字符串组作为一个整体处理的情况。必须有办法做到这一点。就算丑
-
哦,我确定有 a 方法。祝你好运!
标签: python pandas list group-by pandas-groupby