根据某些条件手动创建虚拟,出了什么问题?

时间:2014-04-22 03:30:27

标签: python-2.7 csv pandas

我有一个数据集,其中包含一列数字和NaN。我想创建一个新的虚拟变量列以供进一步计算。显然有些事情是错的,因为无论我做什么,假人都会是1。

import pandas as pd
import numpy as np
all_air = pd.read_csv('small.csv')

all_air['D(0/1)']=np.nan
#all_air['C'].fillna(-1) #pandas will take NaN as 0 in calculation, right?
print all_air['C']


for n in all_air['C']:
    if n is None:
        all_air['D(0/1)'] = 0
    else:
        all_air['D(0/1)'] = 1
all_air.to_csv('sample_small.csv')

我是python的新手,所以这是我可以达到的目标。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

作业操作

all_air['D(0/1)'] = 0

为名为0的整个列将值设置为'D(0/1)'。因此,实际上,每次遇到n n is None的值时,都会将整列设置为0.同样,当n is not None设置整栏至1

从您的描述中可能看起来您更愿意使用掩码,例如n is None这些位置,并且只修改那些位置的值。

这可以通过loc索引器实现:

all_air['D(0/1)'] = 1
all_air.loc[all_air['C'].isnull(), 'D(0/1)'] = 0

在这个例子中,我使用了内置函数isnull,它可以检查pandas.Series的所有元素,看它们是否为空(NaN或{{1 }})。它返回None个布尔值。那些评估为pandas.Series的位置将被视为评估指标的一部分。

因此,通过将此作为True索引的第一个维度传递,我们可以仅修改这些行中的值。第二个维度标识要修改的列。将loc的值放在右侧会自动将该标量广播为兼容的数组形状,以便将其分配到列中(某些0 - by - K列向量,其中1将是空条目的数量。)