向 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/stack
或reindex
添加缺失值:
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
pandas使用zfill函数向dataframe特定数据列的每个字符串添加前置(前缀)补齐字符使得当前数据列内容所有字符长度相同(向列A的每个字符串添加前导零,直到达到4的宽度)