有条件地处理数据框

时间:2018-09-13 20:11:19

标签: python-3.x pandas dataframe

我有以下数据,我尝试执行以下操作;

  1. 如果tag_3和tag_4中的元素为“ NaN”,则返回包含以下列的中间df:tag_0,tag_1和tag_2。
  2. 如果tag_4中的元素仅是'NaN',则返回具有以下列的另一个中间df:tag_0,tag_2,tag_3。
  3. 最后,如果所有列都具有非NaN值,则返回包含以下列的中间df:tag_0,tag_3,tag_4。

数据:

data = {'tag_0': ['1', '2', '3'],
        'tag_1': ['4', '5', '6'],
        'tag_2': ['7', '8', '9'],
        'tag_3': ['NaN', '10', '11'],
        'tag_4': ['NaN', 'NaN', '12']}

df_1 = pd.DataFrame(data, columns = ['tag_0', 'tag_1', 'tag_2', 'tag_3', 'tag_4'])

dummy data

1 个答案:

答案 0 :(得分:1)

我喜欢在熊猫中使用bool口罩来完成此类任务,因为我认为它很容易阅读,但是还有其他解决方法。

什么是防毒面具?

布尔型掩码实际上是Series的True / False值,该值应用于DataFrame进行过滤。


步骤1:创建True / False值的Series

tag_3_is_nan = df['tag3'].isna()
tag_4_is_nan = df['tag4'].isna()

步骤2:将它们应用于DataFrame

df[bool_mask]

在您的情况下,将使用以下逻辑进行应用。

情况1:如果tag_3和tag_4中的元素为“ NaN”,则返回包含以下列的中间df:tag_0,tag_1和tag_2。

df[tag_3_is_nan & tag_4_is_nan][['tag_0', 'tag_1', 'tag_2']]

情况2:如果tag_4中的元素仅是'NaN',则返回具有以下列的另一个中间df:tag_0,tag_2,tag_3。

df[tag_4_is_nan & ~tag_3_is_nan][['tag_0', 'tag_2', 'tag_3']]

~等于not-因此~tag_3_is_nan表示tag_3不是nan。

情况3:最后,如果所有列都具有非NaN值,则返回包含以下列的中间df:tag_0,tag_3,tag_4。

在熊猫中,删除包含至少一个NaN值的所有行很简单-只需使用方法dropna()

df.dropna()[['tag_0', 'tag_3', 'tag_4']]
  • 为避免settingWithCopyWarning下移,您应该复制过滤后的df

以上使用None,但是您的示例使用'NaN'作为string。如果您的数据包含字符串'NaN'而不是实际的None,则可以使用相同的方法。

tag_3_is_nan_string = df['tag3'] == 'NaN'