Python 2.7 根据某些条件手动创建虚拟对象,出现了什么问题?
我有一个数据集,它有一列数字和N。我想创建一列新的虚拟变量,以便进一步计算。显然有点不对劲,因为不管我做什么,这个假人都是1Python 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
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循环,而支持可以直接应用于数组的操作,并以预期的方式处理它们的数组属性。