[英]Collect values of pandas dataframe column A if column B is NaN (Python)
[英]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_z
、 D_z
。 为此,它从C_y
和D_y
列复制日期。 如果两列中的特定行都没有日期,它会从C_x
、 D_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.