pandas 处理NaN值的分割 Dataframe 列表列

5us2dqdw  于 2023-01-01  发布在  其他
关注(0)|答案(3)|浏览(103)

我有一个 Dataframe ,其中一列的所有元素都是列表,但有些元素是NaN。
| 日期|价值|
| - ------| - ------|
| 2022年1月1日|0岁、16岁|
| 2022年2月1日|0、22岁|
| 2022年3月1日|0、15岁|
| 2022年4月1日|0、2|
| 2022年5月1日|钠氮|
我试图用panda函数to_list将另外两列中的值分开,每列对应一个数据,但是列中有NaN时我做不到,我可以使用dropna,但是我需要日期数据,我的意图是用0,0替换NaN。
最后我想达到的是这个结果,无论如何达到:
| 日期|价值|A类|乙|
| - ------| - ------| - ------| - ------|
| 2022年1月1日|0岁、16岁|无|十六|
| 2022年2月1日|四、二十二|四个|二十二|
| 2022年3月1日|八、十五|八个|十五|
| 2022年4月1日|八、二|八个|第二章|
| 2022年5月1日|钠氮|无|无|
谢谢!

2nc8po8w

2nc8po8w1#

你的话就走吧

out = df.join(df['Value'].str.split(', ',expand=True).fillna(0))
#df['Value'].str.split(', ',expand=True).fillna(0)
Out[34]: 
   0   1
0  0  16
1  0  22
2  0  15
3  0   2
4  0   0
3lxsmp7m

3lxsmp7m2#

假设您的Value列实际上是list类型,而不是str类型,您可以:

df[["A", "B"]] = df["Value"].apply(pd.Series).fillna(0)
rn0zuynd

rn0zuynd3#

我认为Chrysophylaxs和BENY的答案比我的好得多,但我会附和我的解决方案:

df = pd.DataFrame(data = [['01/01/2022', [0, 16]],
                         ['02/01/2022', [0, 22]],
                          ['05/01/2022', np.nan]
                         ], columns = ['date', 'value'])

def split_value(row):
    try:
        return pd.Series({'value_A': row['value'][0], 'value_B': row['value'][1]})
    except:
        return pd.Series({'value_A': 0, 'value_B': 0})

df[['value_A', 'value_B']] = df.apply(split_value, axis=1)

这将返回结果

date    value   value_A value_B
0   01/01/2022  [0, 16] 0   16
1   02/01/2022  [0, 22] 0   22
2   05/01/2022  NaN     0   0

相关问题