pandas 重构DataFrame以使用其他列的数据填充NaN,合并行

42fyovps  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(132)

欲望是输入DataFrame减少到namecolor列。如果updated_name|color有数据,请使用它。如果是''Nan在真实数据集中),则使用updated_name|color列中输入的值(如果存在),如果不存在,则使用original_name|color列中的值。
在真实的数据集得到了大约远至DataFrame下面使用:

mask = df['updated_name'].notnull() | df['updated_color'].notnull()

字符串
我被困在下一步。
一个例子DataFrame价值一千字,最小可行性如下:
输入DataFrame
| 原名|原色|更新名称|更新颜色| updated_color |
| --|--|--|--| ------------ |
| 快乐熊|红色|绿色熊|||
| 快乐熊|红色||||
| 快乐熊|红色||||
| 坏脾气熊|蓝色||||
| 坏脾气熊|蓝色||紫色| Purple |
| 坏脾气熊|蓝色||||
| 困熊|黄色|能量熊|||
| 困熊|黄色||||
| 困熊|黄色||亮黄色| Bright Yellow |
预期结果:
| 姓名|颜色| color |
| --|--| ------------ |
| 绿色熊|红色| Red |
| 坏脾气熊|紫色| Purple |
| 能量熊|亮黄色| Bright Yellow |

vaj7vani

vaj7vani1#

构造一个dataframe,使updated_name|color列优先进行布尔检查:

pd.DataFrame([(k, (g['updated_name'].dropna().unique() or g['original_name'].unique())[0], 
                  (g['updated_color'].dropna().unique() or g['original_color'].unique())[0]) 
                   for k, g in df.groupby('sql_Key')], columns=['sql_Key', 'name', 'color'])

个字符

5lhxktic

5lhxktic2#

这是可行的,虽然我觉得它可以更简单:对于每个组中的每个字段,获取第一个非空“更新”值,否则获取第一个非空“原始”值。

g = df.groupby('sql_Key')

pd.concat(
    [
        g[f'updated_{v}'].first().fillna(g[f'original_{v}'].first()).rename(v)
        for v in ['name', 'color']],
    axis=1)

个字符

相关问题