如何从两个不同的pandas dataframe列中添加值

时间:2016-07-06 17:29:27

标签: python pandas

如何将数据帧的两个不同列中的第一行添加到一起,这样如果列A的第一行为NaN,则替换为balance第一行的值,否则添加列A的第一行和balance的第一行。 B列也是如此。这个想法是使用balnce第一行来转换其他列'A和B的第一行。 我尝试使用df.iloc[0]获取第一行,但我无法设置值或添加它:

data = {'id': [1, 2, 3, 4, 5, 6],
        'A': [None, None, 20, 10, 39, 30],
        'B': [13, 98, 23, 45, 64, 10],
        'balance': [23, 41, 12, 22, 32, 0]}

df = pd.DataFrame(data)
df = df.set_index('id')
print df

    A   B    balance
id                 
1  NaN  13   23
2  NaN  98   41
3   20  23   12
4   10  45   22
5   39  64   32
6   30  10   0

for i in df.columns:
    if i not in ['balance']:
        if df[i].iloc[0] == None:
            df[i].iloc[0] = df['balance'].iloc[0]
        else:
            df[i].iloc[0] = df[i].iloc[0] + df['balance'].iloc[0]

        print df[i]


id
1   NaN
2   NaN
3    20
4    10
5    39
6    30
Name: A, dtype: float64


id
1    36
2    98
3    23
4    45
5    64
6    10
Name: B, dtype: int64
#A[0] should be 23, and B[0] should be 13 + 23 = 36

期望的输出:

id  A   B     balance               
1   23  36       23
2  NaN  98       41
3   20  23       12
4   10  45       22
5   39  64       32
6   30  10        0

1 个答案:

答案 0 :(得分:3)

IIUC如果需要用其他列的值替换NaN,则需要combine_firstfillna

print (df.A.combine_first(df.B))
id
1    13.0
2    98.0
3    20.0
4    10.0
5    39.0
6    30.0
Name: A, dtype: float64

或者:

print (df.A.fillna(df.B))
id
1    13.0
2    98.0
3    20.0
4    10.0
5    39.0
6    30.0
Name: A, dtype: float64


print (df.A.combine_first(df.B) + df.B)
id
1     26.0
2    196.0
3     43.0
4     55.0
5    103.0
6     40.0
dtype: float64

如果需要将两列替换为NaN0,请使用带有参数fill_value的{​​{3}}:

print (df.A.add(df.B, fill_value=0))
id
1     13.0
2     98.0
3     43.0
4     55.0
5    103.0
6     40.0
dtype: float64

编辑:

你需要:

df.ix[1,'A'] = df.ix[1,'balance']
print (df)
       A   B  balance
id                   
1   23.0  13       23
2    NaN  98       41
3   20.0  23       12
4   10.0  45       22
5   39.0  64       32
6   30.0  10        0

EDIT1:

df.ix[1,'A'] = df.ix[1,'balance']
df.ix[1,'B'] = df.ix[1,'B'] + df.ix[1,'balance']

print (df)
       A   B  balance
id                   
1   23.0  36       23
2    NaN  98       41
3   20.0  23       12
4   10.0  45       22
5   39.0  64       32
6   30.0  10        0