pandas 如何在panda中实现sql合并

k75qkfdt  于 2023-03-16  发布在  其他
关注(0)|答案(6)|浏览(145)

我有一个数据框

df = pd.DataFrame({"A":[1,2,np.nan],"B":[np.nan,10,np.nan], "C":[5,10,7]})
     A     B   C
0  1.0   NaN   5
1  2.0  10.0  10
2  NaN   NaN   7

我想添加新列“D”。预期输出为

A     B   C    D
0  1.0   NaN   5    1.0
1  2.0  10.0  10    2.0
2  NaN   NaN   7    7.0

先谢了!

ccrfmcuu

ccrfmcuu1#

另一种方法是使用pd.Seriescombine_first方法。

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({"A":[1,2,np.nan],"B":[np.nan,10,np.nan], "C":[5,10,7]})
>>> df
     A     B   C
0  1.0   NaN   5
1  2.0  10.0  10
2  NaN   NaN   7

我们有

>>> df.A.combine_first(df.B).combine_first(df.C)
0    1.0
1    2.0
2    7.0

我们可以使用reduce来抽象此模式,以便处理任意数量的列。

>>> from functools import reduce
>>> cols = [df[c] for c in df.columns]
>>> reduce(lambda acc, col: acc.combine_first(col), cols)
0    1.0
1    2.0
2    7.0
Name: A, dtype: float64

让我们把所有这些放在一个函数中。

>>> def coalesce(*args):
...     return reduce(lambda acc, col: acc.combine_first(col), args)
...
>>> coalesce(*cols)
0    1.0
1    2.0
2    7.0
Name: A, dtype: float64
hi3rlvi2

hi3rlvi22#

我认为您需要bfill,并通过iloc选择第一列:

df['D'] = df.bfill(axis=1).iloc[:,0]
print (df)
     A     B   C    D
0  1.0   NaN   5  1.0
1  2.0  10.0  10  2.0
2  NaN   NaN   7  7.0

同:

df['D'] = df.fillna(method='bfill',axis=1).iloc[:,0]
print (df)
     A     B   C    D
0  1.0   NaN   5  1.0
1  2.0  10.0  10  2.0
2  NaN   NaN   7  7.0
oo7oh9g9

oo7oh9g93#

备选案文1
一月一日

df.assign(D=df.lookup(df.index, df.isnull().idxmin(1)))

     A     B   C    D
0  1.0   NaN   5  1.0
1  2.0  10.0  10  2.0
2  NaN   NaN   7  7.0

备选案文2
一个月一个月

v = df.values
j = np.isnan(v).argmin(1)
df.assign(D=v[np.arange(len(v)), j])

     A     B   C    D
0  1.0   NaN   5  1.0
1  2.0  10.0  10  2.0
2  NaN   NaN   7  7.0

初始时间测试

  • 超过给定数据 *

  • 在更大的数据上 *

ohfgkhjo

ohfgkhjo4#

在Pandas中已经有一种方法可以实现这一点:

df['D'] = df['A'].combine_first(df['C'])

或者如果你想按顺序查找值,就把它们堆叠起来:

df['D'] = df['A'].combine_first(df['B']).combine_first(df['C'])

这将输出以下内容:

>>> df
     A     B   C    D
0  1.0   NaN   5  1.0
1  2.0  10.0  10  2.0
2  NaN   NaN   7  7.0
wswtfjt7

wswtfjt75#

推广fillna解决方案的简单函数:

def coalesce(df, order):
    result = df[order[0]]
    for column in order[1:]:
        result = result.fillna(df[column])
    return result

df["D"] = coalesce(df, ["A", "B", "C"])
x6yk4ghg

x6yk4ghg6#

另一种方法是用A、B、C的顺序显式地填充D列。

df['D'] = np.nan
df['D'] = df.D.fillna(df.A).fillna(df.B).fillna(df.C)

相关问题