Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在pandas中实现sql合并_Python_Pandas - Fatal编程技术网

Python 如何在pandas中实现sql合并

Python 如何在pandas中实现sql合并,python,pandas,Python,Pandas,我有一个像这样的数据框 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 Na

我有一个像这样的数据框

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
提前谢谢

我认为您需要通过以下方式选择第一列:

同:

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
选项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
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
选项2
numpy

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
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

原始时间测试
过度给定的数据

在更大的数据上


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

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

另一种方法是使用
pd.Series
combine\u first
方法。使用您的示例
df

>>将熊猫作为pd导入
>>>将numpy作为np导入
>>>df=pd.DataFrame({“A”:[1,2,np.nan],“B”:[np.nan,10,np.nan],“C”:[5,10,7]})
>>>df
A、B、C
01.05
1  2.0  10.0  10
2南南7
我们有

>>df.A.先合并(df.B).先合并(df.C)
0    1.0
1    2.0
2    7.0
我们可以使用
reduce
来抽象此模式,以处理任意数量的列

>>从functools导入reduce
>>>cols=[df[c]表示df.columns中的c]
>>>减少(λacc,col:acc.combine_first(col),cols)
0    1.0
1    2.0
2    7.0
名称:A,数据类型:float64
让我们把这些放在一个函数中

def合并(*args): ... 返回减少值(lambda acc,列:acc.combine_first(列),args) ... >>>合并(*cols) 0 1.0 1 2.0 2 7.0 名称:A,数据类型:float64
熊猫系列已经有一种方法可以做到这一点:

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楠楠7.0

第一个代码段中的
df
值错误。那么如何计算预期的输出呢?如果我只需要“A”和“C”来创建“D”,那么我可以在哪里指定它。请让我know@Anoop您可以在
df['A',C']]
上运行这些方法。这对于
numpy
方法尤其有效<代码>v=df['A',C']]。值