熊猫:使用loc然后使用iloc在数据帧​​上设置值

时间:2019-01-20 23:20:55

标签: python pandas dataframe

假设我具有以下数据框:

df = pd.DataFrame(np.zeros((3, 5)), columns=["feature_a", "feature_b", "feature_c", "feature_d", "e"])

    feature_a   feature_b   feature_c   feature_d   e
0      0.0         0.0         0.0         0.0     0.0
1      0.0         0.0         0.0         0.0     0.0
2      0.0         0.0         0.0         0.0     0.0

但是,请注意,我正在处理的数据帧要大得多。然后,我想做的就是更新中间两个要素列的值,这样结果将是:

    feature_a   feature_b   feature_c   feature_d   e
0      0.0         0.0         0.0         0.0     0.0
1      0.0         8.0         8.0         0.0     0.0
2      0.0         0.0         0.0         0.0     0.0

我曾经尝试过的工作可以尝试:

feature_columns = df.filter(like="feature").columns.values
df.loc[:,feature_columns].iloc[1,[1, 2]] = 88

对我来说,按照我尝试的模式完成此操作非常重要。原因是:

  1. 我要更新的列严格包含一个模式。
  2. 一旦选择了列,我就知道要更新的行和列索引。

总而言之,我的问题是我如何才能从开始的数据帧转到最终的数据帧,同时又有一个遵循我尝试的方法的解决方案。

1 个答案:

答案 0 :(得分:2)

这是您处理问题中显示的特定示例的方式:

import pandas as pd

df = pd.DataFrame(np.zeros((3, 5)), columns=["feature_a", "feature_b", "feature_c", "feature_d", "e"])
feature_columns = df.filter(like="feature").columns.values

sli = df[feature_columns].iloc[1,[1,2]]
df.loc[sli.name, sli.index] = 88
print(df)
# output
#        feature_a  feature_b  feature_c  feature_d    e
#     0        0.0        0.0        0.0        0.0  0.0
#     1        0.0       88.0       88.0        0.0  0.0
#     2        0.0        0.0        0.0        0.0  0.0

根据精确的应用程序,您可能需要稍微改变一下确切的语法,但是这个想法广泛适用:收集所选内容的列和索引,然后使用它们切成df.loc,然后分配到那片。这样就可以解决您遇到的“分配副本”问题。