我正在尝试使用熊猫重命名CSV文件中的列。我想使用字典,因为有时可以将具有相同信息的列命名为不同的名称(例如,mobile_phone和phone而不是phone)。
我想重命名手机的第一个实例。这是一个示例,希望可以进一步解释。
在此示例中为原始内容:
ConstraintLayout
这就是我想要的:
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”。但是,当我运行此代码时,它将列转换为第二列,而不是与字典中的键匹配的第一列。我希望它与CSV中遇到的第一列匹配后停止。
正在发生的事情:
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”,这又不是我想要的。我正在尝试使其仅更改匹配的第一列。
这是添加第三列时发生的示例。 它来自:
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
有什么建议或技巧可以阻止它第二次更改第二个字典匹配,而不是第一个或全部?
在我有一堆elif语句之前,但我认为字典会更简洁易读。
答案 0 :(得分:0)
这是一种解决方案:
df
:
Columns: [name, mobile_phone, telephone]
Index: []
在列索引中找到第一个电话实例(从左到右):
a = [True if ('phone' in df.columns[i]) & ('phone' not in df.columns[i-1]) else False for i in range(len(df.columns))]
获取需要重命名的列phone
:
phonecol = df.columns[a][0]
重命名该列:
df.rename(columns = {phonecol : 'phone'})
输出:
Columns: [name, phone, telephone]
Index: []
答案 1 :(得分:0)
您不应该期望pd.DataFrame.rename
通过dict
输入应用任何特定的顺序排序。即使逻辑有效,由于文档没有描述实际过程,因此这将是实现细节。
相反,您可以使用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.')