这个问题与以下请求完全相同,还有一个问题,
所以,我想设置或有条件地设置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
来表达它。
答案 0 :(得分:1)
您可以使用方括号来使用字符串而不是属性来访问列名称,我还强烈建议您放弃按属性访问列的习惯,因为这会导致混淆行为,例如,如果您有列名称sum
,您df.sum
将返回方法sum
的地址,而不是列'sum'
。
所以df[Col] = df[Col] + 1
就会起作用。
关于第二个问题,要将数组与标量值进行比较,请使用&
,|
和~
的按位运算符and
,or
和not
&
分别返回一个布尔值数组,要使用多于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屏蔽到只满足两个条件的行