繁体   English   中英

Pandas Dataframe 用 B 列的值替换 A 列的 NaN 值

[英]Pandas Dataframe replace NaN values of column A with values from column B

我有以下 DataFrame 是我在合并两个 df 后得到的:

一种 C_x D_x C_y D_y
0 1136006640 NaT NaT 2022-11-18 2022-11-24
1个 1136030941 NaT NaT 2022-11-30 2022-12-09
3个 1136051543 2022-11-25 2022-12-16 NaT NaT
4个 1136072241 NaT NaT 2022-12-20 2022-12-29

如何加入 C 和 D 列,以便将 NaT 值替换为日期。 如果 _x 列有数据,则 _y 列始终为 NaT,反之亦然。 我可以在合并时解决这个问题,还是必须在之后解决?

下面的代码构造新列C_zD_z 为此,它从C_yD_y列复制日期。 如果两列中的特定行都没有日期,它会从C_xD_x复制日期。

import pandas as pd
import numpy as np

from io import StringIO
    
# setup sample data
data = """  
A;B;C_x;D_x;C_y;D_y
0;1136006640;NaT;NaT;2022-11-18;2022-11-24
1;1136030941;NaT;NaT;2022-11-30;2022-12-09
3;1136051543;2022-11-25;2022-12-16;NaT;NaT
4;1136072241;NaT;NaT;2022-12-20;2022-12-29
"""
df = pd.read_csv(StringIO(data), sep=';', parse_dates=['C_x','D_x','C_y','D_y'])

# copy `C_y`,`D_y`
df[['C_z','D_z']] = df[['C_y','D_y']]

# combine dates
mask = df[['C_y','D_y']].isnull().all(axis=1)
df.loc[mask,'C_z'] = df['C_x']
df.loc[mask,'D_z'] = df['D_x']

结果:

   A           B        C_x        D_x        C_y        D_y        C_z        D_z
0  0  1136006640        NaT        NaT 2022-11-18 2022-11-24 2022-11-18 2022-11-24
1  1  1136030941        NaT        NaT 2022-11-30 2022-12-09 2022-11-30 2022-12-09
2  3  1136051543 2022-11-25 2022-12-16        NaT        NaT 2022-11-25 2022-12-16
3  4  1136072241        NaT        NaT 2022-12-20 2022-12-29 2022-12-20 2022-12-29

使用DataFrame.combine_first删除相同列名称的后缀:

df1 = df.filter(regex='_x$').rename(columns=lambda x: x.replace('_x',''))
df2 = df.filter(regex='_y$').rename(columns=lambda x: x.replace('_y',''))

df = df.join(df1.combine_first(df2))
print (df)
   A           B        C_x        D_x        C_y        D_y          C  \
0  0  1136006640        NaT        NaT 2022-11-18 2022-11-24 2022-11-18   
1  1  1136030941        NaT        NaT 2022-11-30 2022-12-09 2022-11-30   
2  3  1136051543 2022-11-25 2022-12-16        NaT        NaT 2022-11-25   
3  4  1136072241        NaT        NaT 2022-12-20 2022-12-29 2022-12-20   

           D  
0 2022-11-24  
1 2022-12-09  
2 2022-12-16  
3 2022-12-29  

如果输入数据是这样的:

print (df1)
            B          C          D
0  1136051543 2022-11-25 2022-12-16

print (df2)
            B          C          D
0  1136006640 2022-11-18 2022-11-24
1  1136030941 2022-11-30 2022-12-09
2  1136072241 2022-12-20 2022-12-29

然后改为使用concat merge (如果df1.index不存在于df2.index中,那么merge创建缺失值,就像有问题的那样):

df = pd.concat([df1, df2]).sort_values('B', ignore_index=True)
print (df)
            B          C          D
0  1136006640 2022-11-18 2022-11-24
1  1136030941 2022-11-30 2022-12-09
2  1136051543 2022-11-25 2022-12-16
3  1136072241 2022-12-20 2022-12-29

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM