【问题标题】:Change Value in pandas dataframe with conditions and index使用条件和索引更改熊猫数据框中的值
【发布时间】:2020-01-29 16:15:56
【问题描述】:

我不明白为什么下面的代码不起作用:

df_sensor.loc[(df_sensor.user_id == labels_user_id) & (df_sensor.exp_id == labels_exp_id),'activity_id'].iloc[start:end] = labels['activity_id'][I]

这一行

df_sensor.loc[(df_sensor.user_id == labels_user_id) & (df_sensor.exp_id == labels_exp_id),'activity_id'].iloc[start:end]

返回这个数据框

Dataframe

我想从特定索引(开始和结束)更改 user_id 和 exp_id 的值

编辑

我有 2 个数据框

1: Dataframe 1

2: Dataframe 2

我想将 DF1 的 activity_id 从 DF2.activity_id 更改为 start 和 end 作为索引

【问题讨论】:

  • 您使用的是链式赋值.loc[].iloc[] =,所以虽然这不是典型的][ 链式问题,但结果仍然是您永远不会更改DataFrame。您能否提供更多信息,例如您的索引是否重复,或者一些示例数据?有几种方法可以处理这种更复杂的选择。
  • 感谢您的回复!我刚刚编辑了问题
  • 我提供了一个答案来说明问题,并且应该让您通过一些非常小的替换来解决它。 IE。你会使用m = (df_sensor.user_id == labels_user_id) & (df_sensor.exp_id == labels_exp_id)'activity_id' 而不是'name'
  • 除非绝对必要,否则请不要将信息共享为图像,此处并非如此。

标签: python pandas dataframe anaconda


【解决方案1】:

您的问题是链式分配:df.loc[].iloc[] =,它不会更改 DataFrame。但是,您的选择很复杂,您希望更改仅在初始切片之后确定的值范围。

我们可以定义您的初始掩码并使用cumsum 进行一些数学运算,以允许通过单个.loc 调用进行相同的选择。


样本数据

  name  year  value
0    A  2010      1
1    A  2011      2
2    B  2014      5
3    A  2012      3
4    A  2013      4

### Illustrate the problem
start = 1
end = 3
df.loc[df.name.eq('A'), 'name'].iloc[start:end] = 'foo'

# Nothing changes...
print(df)
#  name  year  value
#0    A  2010      1
#1    A  2011      2
#2    B  2014      5
#3    A  2012      3
#4    A  2013      4

代码

# Define your initial `.loc` condition
m = df.name.eq('A')

# Keep only True within the selection range. `where` logic allow for gaps.
m = (m.cumsum().gt(start) & m.cumsum().le(end)).where(m).fillna(False).astype(bool)

# Original df.loc[].iloc[] is a single selection:
df.loc[m, 'name'] = 'foo'

print(df)
#  name  year  value
#0    A  2010      1
#1  foo  2011      2
#2    B  2014      5
#3  foo  2012      3
#4    A  2013      4

【讨论】:

    猜你喜欢
    • 2020-04-01
    • 2019-06-21
    • 2023-02-21
    • 2017-03-18
    • 2017-09-17
    • 2018-08-21
    • 1970-01-01
    • 2020-05-24
    • 2020-06-24
    相关资源
    最近更新 更多