gpt4 book ai didi

python - Pandas - 仅重命名第一个字典匹配项而不是最后一个匹配项

转载 作者:太空宇宙 更新时间:2023-11-03 21:43:18 25 4
gpt4 key购买 nike

我正在尝试使用 pandas 重命名 CSV 文件中的列。我想使用字典,因为有时具有相同信息的列可以以不同的方式命名(例如 mobile_phone 和 Phone 而不是 Phone)。

我想重命名电话的第一个实例。这是一个示例,希望能解释更多。

此示例的原文如下:

0 name     mobile_phone     telephone
1 Bob 12364234234 12364234234
2 Joe 23534235435 43564564563
3 Jill 34573474563 78098080807

这是我想要它做的事情:

0 name     phone            telephone
1 Bob 12364234234 12364234234
2 Joe 23534235435 43564564563
3 Jill 34573474563 78098080807

这是我尝试过的代码:

phone_dict = {
'phone_number': 'phone',
'mobile_phone': 'phone',
'telephone': 'phone',
'phones': 'phone',
}

if 'phone' not in df.columns:
df.rename(columns=dict(phone_dict), inplace=True)
if 'phone' not in df.columns:
raise ValueError("What are these peoples numbers!? (Need 'phone' column)")

我制作了一本包含一些可能的列名称的字典,我希望将它们命名为“phone”。但是,当我运行此代码时,它将列更改为第二列,而不是与字典中的键匹配的第一列。我希望它在与 CSV 中遇到的第一列匹配后停止。

这就是正在发生的事情:

0 name     mobile_phone     phone
1 Bob 12364234234 12364234234
2 Joe 23534235435 43564564563
3 Jill 34573474563 78098080807

例如,如果有第三列与字典匹配,它们会转向“电话”,这又不是我想要的。我试图让它只更改它匹配的第一列。

下面是添加第三列时发生的情况的示例。它来自:

0 name     mobile_phone     telephone      phone_1
1 Bob 12364234234 12364234234 36346346311
2 Joe 23534235435 43564564563 34634634623
3 Jill 34573474563 78098080807 34634654622

对此:

0 name     phone            phone          phone
1 Bob 12364234234 12364234234 36346346311
2 Joe 23534235435 43564564563 34634634623
3 Jill 34573474563 78098080807 34634654622

但我希望它是这样的:

0 name     phone            telephone      phone_1
1 Bob 12364234234 12364234234 36346346311
2 Joe 23534235435 43564564563 34634634623
3 Jill 34573474563 78098080807 34634654622

有什么建议或技巧可以阻止它再次更改第二个字典匹配而不是第一个或全部吗?

之前我有一堆 elif 语句,但我认为字典会更干净、更容易阅读。

最佳答案

您不应期望 pd.DataFrame.renamedict 输入应用任何特定的顺序排序。即使逻辑有效,它也将是一个实现细节,因为文档没有描述实际的过程。

相反,您可以使用 pd.DataFrame.filter 查找第一个有效的列标签:

df = df.rename(columns={df.filter(like='phone').columns[0]: 'phone'})

print(df)

0 name phone telephone
0 1 Bob 12364234234 12364234234
1 2 Joe 23534235435 43564564563
2 3 Jill 34573474563 78098080807

如果有效列可能存在,您可以捕获IndexError:

try:
df = df.rename(columns={df.filter(like='phones').columns[0]: 'phone'})
except IndexError:
print('No columns including "phones" exists.')

关于python - Pandas - 仅重命名第一个字典匹配项而不是最后一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52684961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com