首页 > 解决方案 > 如何根据索引位置标准化 Pandas 数据框中的值?

问题描述

我有许多熊猫数据框,每个数据框都有一个“扬声器”列和两个标签之一。通常为 0-1,但在某些情况下为 1-2、1-3 或 0-2。我正在尝试找到一种方法来遍历我的所有数据框并将它们标准化,以便它们共享相同的标签(0-1)。

它们之间的一个一致特征是出现的第一个标签(即在数据帧的第一行中)应始终映射到“0”,而第二个标签应始终映射到“1”。

这是我需要更改的数据框之一的示例- 请注意其他人将有不同的标签:

import pandas as pd
data = [1,2,1,2,1,2,1,2,1,2]

df = pd.DataFrame(data, columns = ['speaker'])

我希望能够进行更改,使其显示为 [0,1,0,1,0,1,0,1,0,1]。

到目前为止,我已经尝试在一个更大的 for 循环中插入以下代码,该循环遍历每个数据帧。但是它根本不起作用:

for label in data['speaker']:
    if label == data['speaker'][0]:
        label = '0'
    else:
        label = '1'

希望以上内容清楚的是,我正在尝试创建类似于以下规则的规则:“在 'Speaker' 中查找与第一个索引位置的标签匹配的所有实例,并将其更改为 '0'。对于所有其他实例,请更改此到‘1’。”

标签: pythonpandas

解决方案


方法一

我们可以在此处使用iat+np.where来有条件地创建您的列:

# import numpy as np 

first_val = df['speaker'].iat[0] # same as df['speaker'].iloc[0]

df['speaker'] = np.where(df['speaker'].eq(first_val), 0, 1)
   speaker
0        0
1        1
2        0
3        1
4        0
5        1
6        0
7        1
8        0
9        1

方法二:

我们也可以使用booleans,因为我们可以将它们转换为integers

first_val = df['speaker'].iat[0]
df['speaker'] = df['speaker'].ne(first_val).astype(int)
   speaker
0        0
1        1
2        0
3        1
4        0
5        1
6        0
7        1
8        0
9        1

只有当您的值实际上是1, 2我们可以使用时floor division

df['speaker'] = df['speaker'] // 2
# same as: df['speaker'] = df['speaker'].floordiv(2)
   speaker
0        0
1        1
2        0
3        1
4        0
5        1
6        0
7        1
8        0
9        1

推荐阅读