简体   繁体   English

熊猫如何根据其他列填充NaN / None值?

[英]pandas how to fill NaN/None values based on the other columns?

Given the following, how can I set the NaN/None value of the B row based on the other rows? 给定以下内容,如何根据其他行设置B行的NaN / None值? Should I use apply? 我应该使用申请吗?

d = [
    {'A': 2, 'B': Decimal('628.00'), 'C': 1, 'D': 'blue'},
    {'A': 1, 'B': None, 'C': 3, 'D': 'orange'},
    {'A': 3, 'B': None, 'C': 1, 'D': 'orange'},
    {'A': 2, 'B': Decimal('575.00'), 'C': 2, 'D': 'blue'},
    {'A': 4, 'B': None, 'C': 1, 'D': 'blue'},
]

df = pd.DataFrame(d)

# Make sure types are correct
df['B'] = df['B'].astype('float')
df['C'] = df['C'].astype('int')

In : df
Out:
   A    B  C       D
0  2  628  1    blue
1  1  NaN  3  orange
2  3  NaN  1  orange
3  2  575  2    blue
4  4  NaN  1    blue

In : df.dtypes
Out:
A      int64
B    float64
C      int64
D     object
dtype: object

Here is an example of the "rules" to set B when the value is None: 这是当值设置为None时设置B的“规则”的示例:

def make_B(c, d):
    """When B is None, the value of B depends on C and D."""
    if d == 'blue':
        return Decimal('1400.89') * 1 * c
    elif d == 'orange':
        return Decimal('2300.57') * 2 * c
    raise

Here is the way I solve it: 这是我解决的方法:

I define make_B as below: 我定义make_B如下:

def make_B(x):
    if np.isnan(x['B']):
        """When B is None, the value of B depends on C and D."""
        if x['D'] == 'blue':
            return Decimal('1400.89') * 1 * x['C']
        elif x['D'] == 'orange':
            return Decimal('2300.57') * 2 * x['C']
    else:
        return x['B']

Then I use apply: 然后我使用apply:

df.apply(make_B,axis=1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM