如何将pd.value_counts()结果与自定义变量追加到DataFrame行中?
嘿,这个需求很常见,我给你两种靠谱的实现方式,都能精准达到你想要的效果:
方法1:逐次处理并追加到结果DataFrame
适合循环次数不多的场景,每次循环单独处理当前数据,再追加到最终的DataFrame里,还能自动补全缺失的动物类别并填充0。
先初始化一个空的结果DataFrame:
import pandas as pd # 初始化结果表,指定列顺序和初始列 result_df = pd.DataFrame(columns=['store', 'cat', 'bird', 'dog'])
然后在每次循环里这么处理:
# 第一次循环的示例数据 name = 'store1' exampledf = pd.DataFrame({'animal': ['bird', 'bird', 'dog', 'cat', 'cat', 'cat']}) # 统计动物数量,转成带列名的DataFrame counts = exampledf['animal'].value_counts().reset_index() counts.columns = ['animal', 'count'] # 转成宽格式,补全所有动物类别,缺失的填0 current_row = counts.pivot(index=pd.Index([name]), columns='animal', values='count') current_row = current_row.reindex(columns=['cat', 'bird', 'dog'], fill_value=0) # 添加store列并调整顺序 current_row['store'] = name current_row = current_row[['store', 'cat', 'bird', 'dog']] # 追加到结果表 result_df = pd.concat([result_df, current_row], ignore_index=True)
第二次循环重复同样的逻辑就行:
# 第二次循环的示例数据 name = 'store2' exampledf = pd.DataFrame({'animal': ['cat', 'cat', 'bird', 'cat', 'cat', 'bird']}) counts = exampledf['animal'].value_counts().reset_index() counts.columns = ['animal', 'count'] current_row = counts.pivot(index=pd.Index([name]), columns='animal', values='count') current_row = current_row.reindex(columns=['cat', 'bird', 'dog'], fill_value=0) current_row['store'] = name current_row = current_row[['store', 'cat', 'bird', 'dog']] result_df = pd.concat([result_df, current_row], ignore_index=True)
最终你会得到想要的结果:
store cat bird dog 0 store1 3 2 1 1 store2 4 2 0
方法2:先收集所有数据,批量处理
如果你的循环次数很多,这种方法效率更高——先把所有数据收集起来,最后一次性统计转换,避免多次拼接DataFrame的开销。
代码示例:
import pandas as pd # 初始化列表用来存所有带store标记的动物数据 data_records = [] # 第一次循环 name = 'store1' exampledf = pd.DataFrame({'animal': ['bird', 'bird', 'dog', 'cat', 'cat', 'cat']}) # 把当前store的每条动物记录都带上store名称,加入列表 data_records.extend([{'store': name, 'animal': animal} for animal in exampledf['animal']]) # 第二次循环 name = 'store2' exampledf = pd.DataFrame({'animal': ['cat', 'cat', 'bird', 'cat', 'cat', 'bird']}) data_records.extend([{'store': name, 'animal': animal} for animal in exampledf['animal']]) # 把所有数据转成DataFrame,然后用交叉表统计数量,自动补0 full_df = pd.DataFrame(data_records) result_df = pd.crosstab(full_df['store'], full_df['animal']).reset_index() # 调整列顺序匹配你的需求 result_df = result_df[['store', 'cat', 'bird', 'dog']]
运行后得到的结果和方法1完全一致,而且性能更优。
额外提示
如果你的动物类别不是固定的(比如后续可能出现新的动物),可以动态获取所有类别:比如在收集完所有数据后,用all_animals = full_df['animal'].unique()来替换固定的['cat', 'bird', 'dog'],这样就能自动适配新的类别了。
内容的提问来源于stack exchange,提问作者Liquidity
相关产品推荐
相关产品推荐

