微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pandas:在组之前和之后动态添加行

如何解决Pandas:在组之前和之后动态添加行

我有一个 Pandas 数据框:

pd.DataFrame(data={"Value": [5,8,3,2,7,0],"Group": [1,1,2]})

   Value  Group
0    5.0      1
1    0.0      1
2    0.0      1
3    8.0      1
4    0.0      2
5    3.0      2
6    0.0      2
7    2.0      2
8    7.0      2
9    0.0      2

我还计算了每组两行的累积总和:

{"2-cumsum Group 1": array([5.,8.]),"2-cumsum Group 2": array([7.,5.])}

例如array([5.,8.]) 因为 array([5.0,0.0])(第 0 行和第 1 行)+ array([0.0 + 8.0])(第 2 行和第 3 行)= array([5.,8.])

我现在需要的是在 df 的开头、每组之间和 df 的末尾添加两行,以便我获得以下数据框(间隙用于插图目的):

    Value  Group
0    10.0      0    # Initialize with 10.0
1    10.0      0    # Initialize with 10.0

2     5.0      1 
3     0.0      1
4     0.0      1
5     8.0      1

6     5.0      0    # 5.0 ("2-cumsum Group 1"[0])
7     2.0      0    # 8.0 ("2-cumsum Group 1"[1])

8     0.0      2
9     3.0      2
10    0.0      2
11    2.0      2
12    7.0      2
13    0.0      2

14    7.0      0    # 5.0 ("2-cumsum Group 2"[0])
15    5.0      0    # 8.0 ("2-cumsum Group 2"[1])

请注意,原始数据框要大得多,而且不止两列,我需要动态添加具有不同条目的行。例如。要附加的行应该有一个带有“10.0”条目的附加列。此外,计算关于某个整数(在本例中为 2)的累积和是可变的(可能是 8)。

在很多情况下,我需要根据数据帧中的其他行生成行,但除了使用 for 循环和一些保存先前迭代值的临时缓存列表之​​外,我没有找到任何有效的解决方案。 我会很感激一些帮助。 提前致谢并致以亲切的问候。


我的原始代码应用于示例数据,以防有人需要它。这是非常混乱和无效的,所以只有在你真的需要时才考虑它:

import pandas as pd
import numpy as np

# Some stuff
df = pd.DataFrame(data={"Group1": ["a","a","b","b"],"Group2": [1,3],"Group3": [1,9,1],"Value": [5,7]})

length = 2
max_value = 20

g = df['Group1'].unique()
h = df["Group2"].unique()
i = range(1,df['Group3'].max()+1)

df2 = df.set_index(['Group1','Group2','Group3']).reindex(pd.MultiIndex.from_product([g,h,i])).assign(cc = lambda x: (x.groupby(level=0).cumcount())//length).rename_axis(['Group1','Group3'],axis=0)
df2 = df2.loc[~df2['Value'].isna().groupby([pd.Grouper(level=0),df2['cc']]).transform('all')].reset_index().fillna(0).drop('cc',axis=1)

values = df2["Value"].copy().to_numpy()
values = np.array_split(values,len(values)/length) 
stock = df2["Group1"].copy().to_numpy() 
stock = np.array_split(stock,len(stock)/length)

# Generate the "Group" column and generate the "2-cumsum" arrays 
# stored in the "volumes" variable
k = 0
a_groups = []
values_cache = []
volumes = []
for e,i in enumerate(values):
        if any(stock[e] == stock[e-1]):
            if np.any(i + values_cache >= max_value):
                k += 1
                volumes.append(values_cache)
                values_cache = i
            else:
                values_cache += i
            a_groups.extend([k] * length)
        else:
            k += 1
            if e:
                volumes.append(values_cache)
            values_cache = i
            a_groups.extend([k] * length)
volumes.append(values_cache)
df2["Group"] = a_groups

print(df2[["Value","Group"]])
print("\n")
print(f"2-cumsums: {volumes}")

"""Output

   Value  Group
0    5.0      1
1    0.0      1
2    0.0      1
3    8.0      1
4    0.0      2
5    3.0      2
6    0.0      2
7    2.0      2
8    7.0      2
9    0.0      2

2-cumsums: [array([5.,array([7.,5.])]"""

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。