【问题标题】:Pandas set column value based on other columns value with list item by iterationPandas 通过迭代根据列表项的其他列值设置列值
【发布时间】:2019-02-27 05:14:46
【问题描述】:

我正在尝试根据另一个列值设置 pandas 列的值。新值应通过迭代列表来设置,该列表与col1 的唯一值具有相同的长度

例子:

d = {'col1': [1, 2,2,2,3,3,4], 'col2': [1,1,1,1,1,1,1]}
df = pd.DataFrame(data=d)
items_to_add=[5,2,11,9]
#list has length of unique values in `column1`

现在我想添加例如 5 到 column2 如果 column1 是 1 和 2 到所有 column2 行其中 column1 是 2 .... 所以我应该得到:

col1    col2
1       5
2       2
2       2
2       2
3       11
3       11
4       9

这段代码给我一个语法错误,但我不知道为什么

items_to_add=[5,2,11,9]
for i in range(len(items_to_add)):
    df['col2'][df.col1[i]] = items_to_add[i]

我做错了什么?我该如何解决?

【问题讨论】:

  • 您在df = df = pd.DataFrame(data=d) 中没有收到任何错误吗?

标签: python pandas loops


【解决方案1】:

您可以通过创建字典来简单地替换 col1 中的值,即

di =  dict(zip(df['col1'].unique(), items_to_add))
# {1: 5, 2: 2, 3: 11, 4: 9}
df['col3'] = df['col1'].map(di)

   col1  col2  col3
0     1     1     5
1     2     1     2
2     2     1     2
3     2     1     2
4     3     1    11
5     3     1    11
6     4     1     9

【讨论】:

  • 如果我不仅想按col1分组,而且我想要它们的独特组合,那么您知道该怎么做吗? @黑暗
  • @Mauritius 没有看到数据我什么也说不出来。
【解决方案2】:

这就是你所做的

df['col2'] = df['col1'].apply(lambda x: items_to_add[x-1])

通过这样做,您将创建一个新列col2,其中对于df[col1] 中的每个x,您选择(x-1)th 索引值items_to_add

【讨论】:

  • 看起来不错,但它告诉我。 list indices must be integer not float ...不知道他为什么认为 z 是浮动的
  • 哦,您必须确保 df['col1'] 是 int 类型,或者将 x 转换为 int,如 items_to_add[int(x)-1]
【解决方案3】:

我认为您需要删除重复项然后映射,

df['col1'].map(dict(zip(df['col1'].drop_duplicates(),items_to_add)))
#out[]
0     5
1     2
2     2
3     2
4    11
5    11
6     9

【讨论】:

  • 我想保留副本。否则这可能是一个好方法
  • 现在检查输出
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 2019-12-27
  • 2020-12-22
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2022-07-28
相关资源
最近更新 更多