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

Python 2.7 根据某些条件手动创建虚拟对象,出现了什么问题?,python-2.7,csv,pandas,Python 2.7,Csv,Pandas,我有一个数据集,它有一列数字和N。我想创建一列新的虚拟变量,以便进一步计算。显然有点不对劲,因为不管我做什么,这个假人都是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_ai

我有一个数据集,它有一列数字和N。我想创建一列新的虚拟变量,以便进一步计算。显然有点不对劲,因为不管我做什么,这个假人都是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还不熟悉,所以这是我能做的。
提前感谢。

分配操作

all_air['D(0/1)'] = 0
将名为
'D(0/1)
的整个列的值设置为
0
。因此,实际上,每次遇到
n
的值,其中
n为None
,都将整列设置为0。同样,当
n不是None
时,将整列设置为
1

从您的描述看来,您更希望有一个掩码,例如
n为None的位置,并且只修改这些位置的值

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

all_air['D(0/1)'] = 1
all_air.loc[all_air['C'].isnull(), 'D(0/1)'] = 0
在本例中,我使用了内置函数
isnull
,该函数可以检查
pandas.Series
的所有元素是否为null(
NaN
None
)。它返回布尔值的
pandas.Series
。评估结果为
True
的位置将被视为评估指数的一部分


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

我理解您答案的前半部分(在loc之前)。所以我应该在for循环之前添加这个,对吗?for循环是不必要的(事实上,效率很低)。一般来说,在Python科学堆栈中,您希望避免for循环,而支持可以直接应用于数组的操作,并以预期的方式处理它们的数组属性。