使用已知列值更改 pandas DataFrame 中多个列的值

6
假设我有一个像这样的数据框:
Knownvalue    A    B    C    D    E    F    G    H
  17.3413     0    0    0    0    0    0    0    0
  33.4534     0    0    0    0    0    0    0    0

我想要实现的功能是,当已知值在0-10之间时,将A从0改变为1。当已知值在10-20之间时,将B从0改变为1,以此类推。

更改后应该是这样的:

Knownvalue     A    B    C    D    E    F    G    H
   17.3413     0    1    0    0    0    0    0    0
   33.4534     0    0    0    1    0    0    0    0

有人知道如何应用一种方法来改变它吗?


请将以下与编程有关的内容从英语翻译成中文。仅返回翻译后的文本:(注意:文本比图像更方便,因为您可以复制和粘贴文本。因此,我已恢复为文本版本。) - DSM
2个回答

5
我首先将 Knownvalue 系列分成一组整数,其值等于被截断的值除以十(例如,27.87 // 10 = 2)。这些桶代表所需列位置的整数。由于 Knownvalue 在第一列,我将这些值加1。
接下来,我枚举这些桶值,这实际上给了我行和列整数索引的元组对。我使用 iat 将这些位置的值设置为 1。
import pandas as pd
import numpy as np

# Create some sample data.
df_vals = pd.DataFrame({'Knownvalue': np.random.random(5) * 50})
df = pd.concat([df_vals, pd.DataFrame(np.zeros((5, 5)), columns=list('ABCDE'))], axis=1)

# Create desired column locations based on the `Knownvalue`.
bins = (df.Knownvalue // 10).astype('int').tolist()
>>> bins
[4, 3, 0, 1, 0]

# Set these locations equal to 1.
for idx, col in enumerate(bins):
    df.iat[idx, col + 1] = 1  # The first column is the `Knownvalue`, hence col + 1

>>> df
   Knownvalue  A  B  C  D  E
0   47.353937  0  0  0  0  1
1   37.460338  0  0  0  1  0
2    3.797964  1  0  0  0  0
3   18.323131  0  1  0  0  0
4    7.927030  1  0  0  0  0

你能解释一下 "for n, c in enumerate(idx): df.iat[n, c + 1] = 1" 的意思吗? - dome some
1
@ZixuanZhang,他所做的是检查idx变量是否小于10,如果是,则转换为0;如果大于10但小于20,则转换为1,以此类推。他通过应用floor函数来实现这一点,该函数将一个浮点数向下取整。enumerate获取idx列表并为您提供indexvalue,分别分配给nc。从那里,他使用iat1分配给它们各自的数据框列。 - Leb
@Leb,我刚刚自己想通了!不管怎样,感谢你提供的详细解释! - dome some

4
另一种方法是使用 get_dummies 函数从 Knownvalue 列中重构框架:
>>> import string
>>> new_cols = pd.get_dummies(df["Knownvalue"]//10).loc[:,range(8)].fillna(0)
>>> new_cols.columns = list(string.ascii_uppercase)[:len(new_cols.columns)]
>>> pd.concat([df[["Knownvalue"]], new_cols], axis=1)
   Knownvalue  A  B  C  D  E  F  G  H
0     17.3413  0  1  0  0  0  0  0  0
1     33.4534  0  0  0  1  0  0  0  0

get_dummies 可以完成繁重的工作:

>>> (df.Knownvalue//10)
0    1
1    3
Name: Knownvalue, dtype: float64
>>> pd.get_dummies((df.Knownvalue//10))
   1  3
0  1  0
1  0  1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接