熊猫-仅重命名第一个词典匹配而不是最后一个匹配

时间:2018-10-07 02:24:19

标签: python pandas dictionary indexing python-3.6

我正在尝试使用熊猫重命名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语句之前,但我认为字典会更简洁易读。

2 个答案:

答案 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.')