如何解决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 举报,一经查实,本站将立刻删除。