熊猫结合两列

时间:2018-07-06 12:59:38

标签: python python-3.x pandas pandas-groupby

我有以下数据库:

df = pandas.DataFrame({'Buy':[10,np.nan,2,np.nan,np.nan,4],'Sell':[np.nan,7,np.nan,9,np.nan,np.nan]})

Out[37]: 
    Buy  Sell
0  10.0   NaN
1   NaN   7.0
2   2.0   NaN
3   NaN   9.0
4   NaN   NaN
5   4.0   NaN

我希望o再创建两个名为QuantB/S的列

对于Quant,它的工作状况如下:

df ['Quant'] = df ['Buy']。fillna(df ['Sell'])#从两个列中获取可用值,并且如果两个值均为Nan,则输出为{{1} }。

输出为:

Nan

但是我想基于“他们在创建df Out[39]: Buy Sell Quant 0 10.0 NaN 10.0 1 NaN 7.0 7.0 2 2.0 NaN 2.0 3 NaN 9.0 9.0 4 NaN NaN NaN 5 4.0 NaN 4.0 时从哪一列中获得了价值”来创建B/S

1 个答案:

答案 0 :(得分:2)

您可以执行相等性测试并将其输入numpy.where

df['B/S'] = np.where(df['Quant'] == df['Buy'], 'B', 'S')

对于两个值均为null的情况,您可以使用其他步骤:

df.loc[df[['Buy', 'Sell']].isnull().all(1), 'B/S'] = np.nan

示例

from io import StringIO
import pandas as pd

mystr = StringIO("""Buy    Sell
10      nan
nan      8
4       nan
nan      5
nan      7
3       nan
2       nan
nan     nan""")

df = pd.read_csv(mystr, delim_whitespace=True)

df['Quant'] = df['Buy'].fillna(df['Sell'])
df['B/S'] = np.where(df['Quant'] == df['Buy'], 'B', 'S')
df.loc[df[['Buy', 'Sell']].isnull().all(1), 'B/S'] = np.nan

结果

print(df)

    Buy  Sell  Quant  B/S
0  10.0   NaN   10.0    B
1   NaN   8.0    8.0    S
2   4.0   NaN    4.0    B
3   NaN   5.0    5.0    S
4   NaN   7.0    7.0    S
5   3.0   NaN    3.0    B
6   2.0   NaN    2.0    B
7   NaN   NaN    NaN  NaN