gpt4 book ai didi

python - Pandas 数据帧 : Rolling Set Union Aggregation over multiple Groups

转载 作者:行者123 更新时间:2023-11-28 18:07:05 26 4
gpt4 key购买 nike

我有一个带有 DateTimeIndex 的 DataFrame,一个我想分组的列和一个包含整数集的列:

import pandas as pd

df = pd.DataFrame([['2018-01-01', 1, {1, 2, 3}],
['2018-01-02', 1, {3}],
['2018-01-03', 1, {3, 4, 5}],
['2018-01-04', 1, {5, 6}],
['2018-01-01', 2, {7}],
['2018-01-02', 2, {8}],
['2018-01-03', 2, {9}],
['2018-01-04', 2, {10}]],
columns=['timestamp', 'group', 'ids'])

df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)

group ids
timestamp
2018-01-01 1 {1, 2, 3}
2018-01-02 1 {3}
2018-01-03 1 {3, 4, 5}
2018-01-04 1 {5, 6}
2018-01-01 2 {7}
2018-01-02 2 {8}
2018-01-03 2 {9}
2018-01-04 2 {10}

在每个组中,我想在过去 x 天内构建一个滚动集并集。所以假设 X=3 结果应该是:

            group              ids
timestamp
2018-01-01 1 {1, 2, 3}
2018-01-02 1 {1, 2, 3}
2018-01-03 1 {1, 2, 3, 4, 5}
2018-01-04 1 {3, 4, 5, 6}
2018-01-01 2 {7}
2018-01-02 2 {7, 8}
2018-01-03 2 {7, 8, 9}
2018-01-04 2 {8, 9, 10}

来自 my previous question 的答案我很清楚如何在没有分组的情况下做到这一点,所以到目前为止我想出了这个解决方案:

grouped = df.groupby('group')
new_df = pd.DataFrame()
for name, group in grouped:
group['ids'] = [
set.union(*group['ids'].to_frame().iloc(axis=1)[max(0, i-2): i+1,0])
for i in range(len(group.index))
]
new_df = new_df.append(group)

它给出了正确的结果但看起来很笨拙并且还给出了以下警告:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

不过,提供的链接中的文档似乎并不真正适合我的具体情况。 (至少在这种情况下我无法理解它。)

我的问题:如何改进此代码以使其干净、高效且不抛出警告消息?

最佳答案

作为mentioned in the docs ,不要在循环中使用pd.DataFrame.append;这样做会很昂贵。

相反,使用 list 并提供给 pd.concat .

您可以通过在列表中创建数据副本来避免 SettingWithCopyWarning,即避免 chained indexing通过 assign + iloc 在列表推导中:

L = [group.assign(ids=[set.union(*group.iloc[max(0, i-2): i+1, -1]) \
for i in range(len(group.index))]) \
for _, group in df.groupby('group')]

res = pd.concat(L)

print(res)

group ids
timestamp
2018-01-01 1 {1, 2, 3}
2018-01-02 1 {1, 2, 3}
2018-01-03 1 {1, 2, 3, 4, 5}
2018-01-04 1 {3, 4, 5, 6}
2018-01-01 2 {7}
2018-01-02 2 {8, 7}
2018-01-03 2 {8, 9, 7}
2018-01-04 2 {8, 9, 10}

关于python - Pandas 数据帧 : Rolling Set Union Aggregation over multiple Groups,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52893840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com