python - 将一行分布在共享相同键的其他行上

标签 python pandas dataframe data-processing

我有一个如下所示的数据框:

+------+------------+-------+--------------+
| name |    date    | value | replacement |
+------+------------+-------+--------------+
| A    | 20/11/2016 |    10 | NaN          |
| C    | 20/11/2016 |    8  | [A,B]        |
| B    | 20/11/2016 |    12 | NaN          |
| E    | 25/12/2016 |    16 | NaN          |
| F    | 25/12/2016 |    18 | NaN          |
| D    | 25/12/2016 |    11 | [E,F]        |
+------+------------+-------+--------------+

我想做的事:
对于列 'replacement' 中具有名称列表的每一行,我希望其 'value' 均匀分布在包含这些替换的行上 +同一日期。
对于前面的示例,输出将如下所示:

+------+------------+-------+------------------+
| name |    date    | value | additional value |
+------+------------+-------+------------------+
| A    | 20/11/2016 |    10 |                4 |
| B    | 20/11/2016 |    12 |                4 |
| A    | 25/12/2016 |    16 |              5.5 |
| B    | 25/12/2016 |    18 |              5.5 |
+------+------------+-------+------------------+

我设法找到一种方法来直接执行分配,而无需通过拆分这些行并按名称+日期分组来创建新列,但是 1/太慢了 + 2/我确实需要创建该附加列并且可以'没有找到一种方法来做到这一点。

最佳答案

想法是通过 Series.str.len替换列表的长度创建新列然后DataFrame.explode (pandas 0.25+)将它们转换为标量。将列 value 除以 newmerge按原始与其他列名称添加原始列:

df1 = df.assign(new=df['replacement'].str.len()).explode('replacement')
df1['new'] = df1['value'].div(df1['new'])

df1 = df1[['name','date','value']].merge(df1[['replacement','date','new']],
                                    left_on=['name','date'],
                                    right_on=['replacement','date'])
df1['replacement'] = df1.pop('new')
print (df1)
  name        date  value  replacement
0    A  20/11/2016     10          4.0
1    B  20/11/2016     12          4.0
2    A  25/12/2016     16          5.5
3    B  25/12/2016     18          5.5

类似的解决方案,通过删除而不是选择:

df1 = df.assign(new=df['replacement'].str.len()).explode('replacement')
df1['new'] = df1['value'].div(df1['new'])

df1 = df1.drop(['replacement','new'],1).merge(df1.drop(['name','value'],1),
                                        left_on=['name','date'],
                                        right_on=['replacement','date'])
df1['replacement'] = df1.pop('new')
print (df1)
  name        date  value  replacement
0    A  20/11/2016     10          4.0
1    B  20/11/2016     12          4.0
2    A  25/12/2016     16          5.5
3    B  25/12/2016     18          5.5

关于python - 将一行分布在共享相同键的其他行上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59630237/

相关文章:

python - 查找 Pandas 数据框中的所有重复行

python - 在 Python 中创建大型 MultiIndex(1000 万行)的问题 Pandas 用于重新索引大型 DataFrame

python - 根据列 value_counts (pandas) 过滤数据框

r - 计算复杂数据框中的真/假

python - 如何在 Python 中初始化空列表字典?

python - 如何从 pandas 数据帧中作为列显示的 json 格式数据中检索某些键和值

python-3.x - 如何用其他内容替换数据帧列的每个 "elements"的一部分

python - 设置 pandas Dataframe Boxplot() 的 y 轴刻度,3 个偏差?

python - 谷歌应用程序引擎的顶级用户身份验证方法

python - 如何将 pandas periodIndex 转换为特定的财政年度字符串格式?