有条件地设置pandas数据帧列值

时间:2016-07-06 15:40:11

标签: python python-3.x pandas dataframe

这个问题与以下请求完全相同,还有一个问题,

所以,我想设置或有条件地设置pandas dataframe列值。增加的复杂性是,我不需要使用字符串常量(df['data1'])来处理数据帧列,而是需要使用变量(df[var_for_data1])来解决它们,因为构造了我的df列名称。

以下是解释我想要的简化示例:

df = pd.DataFrame({'data1': np.random.randn(100),'data2': np.random.randn(100)})
print(df.head())

Col = 'data1'
print(df[Col].head())
df.data1 = df.data1 +.1
print(df[Col].head())
# so far so good, now how to do above with variable dataframe column name `Col`
#df.Col = df.Col + .1

问题在于代码,到目前为止一直很好,现在如何使用可变数据框列名Col 进行上述操作。

接下来的问题是如何为上述作业添加条件,比如说if df.data1 >=.25 and df.data1 <= .35:。当然,使用可变数据帧列名Col来表达它。

1 个答案:

答案 0 :(得分:1)

您可以使用方括号来使用字符串而不是属性来访问列名称,我还强烈建议您放弃按属性访问列的习惯,因为这会导致混淆行为,例如,如果您有列名称sum,您df.sum将返回方法sum的地址,而不是列'sum'

所以df[Col] = df[Col] + 1

只要列名存在,

就会起作用。

关于第二个问题,要将数组与标量值进行比较,请使用&|~的按位运算符andornot &分别返回一个布尔值数组,要使用多于1个条件,由于运算符优先级需要将条件包装在括号中,因为df[(df[col] >=.25) & (df[col] <= .35)] 的优先级高于比较运算符。

所以:

ID <- c("A","A","A","B","B","C","C")
Measurement <- c ("Length","Breadth","Breadth","Breadth","Length","Length","Length")  
Value <- c(4.5,6.6,7.5,3.3,5.6,8.9,16.1)
df <- data.frame(ID,Measurement,Value)
df

  ID Measurement Value
1  A      Length   4.5
2  A     Breadth   6.6
3  A     Breadth   7.5
4  B     Breadth   3.3
5  B      Length   5.6
6  C      Length   8.9
7  C      Length  16.1

应该可以工作,这会将df屏蔽到只满足两个条件的行