我有一个排序后的 Dataframe ,如下所示:
| 姓名|年份|价格|
| - ------|- ------|- ------|
| 项目a|二○一九年|十个|
| 项目a|小行星2020|二十个|
| 项目a|小行星2021|三十|
| B|二〇一五年|五十五|
| B|二○一九年|七十五|
| (c)秘书长的报告|二○一一年|十五|
我想添加更多与“Name”出现次数对应的“Price”列,这样 Dataframe 就可以如下所示:
| 姓名|年份|价格|价格_2|价格_3|
| - ------|- ------|- ------|- ------|- ------|
| 项目a|二○一九年|十个|无|无|
| 项目a|小行星2020|二十个|十个|无|
| 项目a|小行星2021|三十|十个|二十个|
| B|二〇一五年|五十五|无|无|
| B|二○一九年|七十五|五十五|无|
| (c)秘书长的报告|二○一一年|十五|无|无|
例如,'a'的第一个示例的价格为10。'a'的第二个示例的价格为20。我想添加一列来反映'a'的第一个示例的价格,即10。
一个名称在我的数据集中出现的最大次数是4,因此添加太多列应该不是问题。
我试着创建一个出现2次的名字列表,一个出现3次的名字列表,等等。然后我试着将这些列表附加到 Dataframe 。尽管这里的问题是在正确的位置添加0,以便列表适当地附加。
我已经为此挣扎了一段时间了,因为我还在适应Python和Pandas。
预先感谢你的帮助。
1条答案
按热度按时间5uzkadbs1#
下面是一个严重依赖列表/数组和
.apply()
方法的解决方案:输入数据
步骤1:累计追加清单中的价格
首先,使用
.groupby()
按Name
字段对DataFrame行进行分组。然后对每个组的
Price
字段使用.apply()
方法两次,嵌套一次将每个价格转换为列表,外部一次使用.cumsum()
方法对它们执行运行“求和”。为了确保列表的顺序正确(根据您想要的输出),还可以使用
.apply()
,将最近附加的值放在前面。电流输出:
第二步:用零填充这些表
要计算DataFrame的price列的最大数量,请找出重复名称的最大数量(在本例中,该值为
3
,因为'a'
的重复名称最多,总共有三个)。然后对每个列表使用
np.pad()
,使它们的长度都与该值匹配,并在右侧填充零。电流输出:
步骤3:将值作为单独的列添加到DataFrame中
指定将分别表示每个列表元素的列标签。
然后用列表值创建一个新的DataFrame,确保使用
.tolist()
方法将它们作为列表/数组的列表传递。从那里,您可以将这些列添加到原始DataFrame中指定的列名下。
最终输出:
完整代码: