2

我是新手,所以这听起来可能很奇怪,但基本上,我有一个很大的数据框,但为了简化起见,我们假设数据框是这样的:

import pandas as pd
import numpy as np

dfn = pd.DataFrame({'a':[1,2,3,4,5],
                   'b':[6,7,8,9,10],
                   'c':np.nan})
dfn

输出:

    a   b   c
0   1   6   NaN
1   2   7   NaN
2   3   8   NaN
3   4   9   NaN
4   5   10  NaN

我想要做的是根据条件填写'c'列中的值,即如果'a'中的相应行值为奇数,则将其添加到相应的行值'b'并输入' c',否则,只需将 'a' 值用于 'c'。

我目前拥有的是这样的:

for row in range(dfn.shape[0]):
    if dfn.loc[row]['a']%2!=0:
        dfn.loc[row]['c']=dfn.loc[row]['a']+dfn.loc[row]['b']
    else:
        dfn.loc[row]['c']=dfn.loc[row]['a']

dfn

输出:

    a   b   c
0   1   6   NaN
1   2   7   NaN
2   3   8   NaN
3   4   9   NaN
4   5   10  NaN

这里似乎什么都没有发生,我不完全确定为什么。

我还尝试了另一种方法:

is_odd=dfn[dfn['a']%2!=0]
is_odd['c'] = is_odd['a'] + is+odd['b']

is_odd

在这里,奇怪的是我得到了正确的输出:

    a   b   c
0   1   1   2
2   3   3   6
4   5   5   10

但是当我再次调用 dfn 时,它会显示所有 NaN 值。

我也试过在不使用变量名的情况下这样做,但没有任何反应。

知道我缺少什么或者是否有办法做到这一点?

谢谢!

4

4 回答 4

1

使用Series.modandSeries.where获取列的副本,b其中0 一个偶数值a,然后我们将此系列添加到a.

dfn['c'] = dfn['b'].where(dfn['a'].mod(2).eq(1), 0).add(dfn['a'])
print(dfn)
   a   b   c
0  1   6   7
1  2   7   2
2  3   8  11
3  4   9   4
4  5  10  15

选择

dfn['c'] = dfn['a'].mask(dfn['a'].mod(2).eq(1), dfn['a'].add(dfn['b']))
于 2020-03-13T10:37:28.190 回答
1

使用numpy where,它适用于条件。它类似于 python 中的 if 语句,但速度要快得多。我很少使用 iterrows,因为我发现它不如 numpy where 高效。

 dfn['c'] = np.where(dfn['a']%2 !=0, 
                     dfn.a + dfn.b,
                     dfn.a)


    a   b   c
0   1   6   7
1   2   7   2
2   3   8   11
3   4   9   4
4   5   10  15

基本上, np.where 中的第一行定义了你的条件,在这种情况下,它是找出“a”列是否为奇数。如果是,则执行下一行。如果是偶数,则执行最后一行。您可以将其视为 if-else 语句。

于 2020-03-13T10:35:00.793 回答
0

dfn.loc[row]['c']=...总是错的。dfn.loc[row]可能是副本或视图,因此您无法知道会发生什么。正确的方法是:

dfn.loc[row, 'c']=...

无论如何,您应该避免迭代并np.where按照其他答案的建议使用

于 2020-03-13T10:38:40.157 回答
0

这是我的解决方案,接近问题作者的原始想法,希望对您有所帮助

def oddadd(x):
    if x['a']%2!=0:
        return x['a']+x['b']
    else:
        return x['a']
dfn["c"] = dfn.apply(oddadd,axis=1)

于 2020-03-13T20:42:27.837 回答