向 Dataframe 添加行以统一组的长度

Posted

技术标签:

【中文标题】向 Dataframe 添加行以统一组的长度【英文标题】:Adding rows to a Dataframe to unify the length of groups 【发布时间】:2017-12-15 13:36:47 【问题描述】:

我想有选择地向 Pandas DataFrame 中的特定组添加元素。特别是,我想添加零,以便所有组具有相同数量的元素。下面是一个简单的例子:

import pandas as pd
df = pd.DataFrame([[1,1], [2,2], [1,3], [2,4], [2,5]], columns=['key', 'value'])
df
   key  value
0    1      1
1    2      2
2    1      3
3    2      4
4    2      5

我希望每个组有相同数量的元素(其中分组按key 列)。组 2 的元素最多:三个元素。但是,第 1 组只有两个元素,因此应按如下方式添加零:

   key  value
0    1      1
1    2      2
2    1      3
3    2      4
4    2      5
5    1      0

请注意,索引无关紧要。

【问题讨论】:

【参考方案1】:

您可以通过cumcount 创建新级别的MultiIndex,然后通过unstack/stackreindex 添加缺失值:

df = (df.set_index(['key', df.groupby('key').cumcount()])['value']
       .unstack(fill_value=0)
       .stack()
       .reset_index(level=1, drop=True)
       .reset_index(name='value'))

替代解决方案:

df = df.set_index(['key', df.groupby('key').cumcount()]) 
mux = pd.MultiIndex.from_product(df.index.levels, names = df.index.names)
df = df.reindex(mux, fill_value=0).reset_index(level=1, drop=True).reset_index()

print (df)
   key  value
0    1      1
1    1      3
2    1      0
3    2      2
4    2      4
5    2      5

如果是重要的值顺序:

df1 = df.set_index(['key', df.groupby('key').cumcount()]) 

mux = pd.MultiIndex.from_product(df1.index.levels, names = df1.index.names)
#get appended values
miss = mux.difference(df1.index).get_level_values(0)

#create helper df and add 0 to all columns of original df
df2 = pd.DataFrame('key':miss).reindex(columns=df.columns, fill_value=0)
#append to original df
df = pd.concat([df, df2], ignore_index=True)

print (df)
   key  value
0    1      1
1    2      2
2    1      3
3    2      4
4    2      5
5    1      0

【讨论】:

以上是关于向 Dataframe 添加行以统一组的长度的主要内容,如果未能解决你的问题,请参考以下文章

更快地遍历一个 DataFrame 的行以将列添加到第二个 DataFrame

将一列空列表添加到 DataFrame

pandas使用zfill函数向dataframe特定数据列的每个字符串添加前置(前缀)补齐字符使得当前数据列内容所有字符长度相同(向列A的每个字符串添加前导零,直到达到4的宽度)

CSS Grid如何选择行以添加悬停效果?

pyqtgraph 动态绘图:添加行以打开 GUI

Python Pandas 向DataFrame中添加一行/一列