如何改进删除Pandasdf列名前缀,基于导入的嵌套json?

idfiyjo8  于 2022-12-09  发布在  其他
关注(0)|答案(2)|浏览(163)

情况
将嵌套的json导入到panda中,我得到了下面的示例df,它带有前缀列名,其工作原理与设计一样,以避免重复的列标题。

import pandas as pd
import re

df = pd.DataFrame({'id': [1,2,3,4],
                   'product': ['a','b','c','d'],
                   'basic.productType':[1,2,3,4],
                   'basic.price':[100,200,300,400],
                   'location.city':['Bremen', 'Hamburg','Berlin','Karlsruhe'],
                   'location.city.zip':[1,2,3,4]
})

我还使用regex解决方案来去除 first level 前缀(包括分隔符在内的所有字符,在本例中为.,并且仅用于第一次出现):

df.columns = [re.sub('^[^.]+[.]','', name) for name in df.columns]

因此,删除前缀后的列如下所示:

['id', 'product', 'productType', 'price', 'city', 'city.zip']

问题

有没有什么解决方案,你可以建议,以改善我的,这是通用的(没有使用的前缀列表)?因为我不是那么熟悉regex,也许有更简单的解决方案,也非regex太。

ecr0jaav

ecr0jaav1#

可以使用拆分,但一般情况下,数据可能是重复的列名,因此,如果选择一列(如df['col']),则获取所有列col
编辑:您可以使用.Index.where中拆分值

df.columns = df.columns.where(~df.columns.str.contains('\.'), 
                               df.columns.str.split('.', n=1).str[1])
print (df)
   id product  productType  price       city  city.zip
0   1       a            1    100     Bremen         1
1   2       b            2    200    Hamburg         2
2   3       c            3    300     Berlin         3
3   4       d            4    400  Karlsruhe         4

或者:

df = df.rename(columns=lambda x: x.split('.', 1)[1] if '.' in x else x)

str.replace解决方案的替代方案:

df.columns = df.columns.str.replace('^[^.]+[.]','')
iecba09b

iecba09b2#

df = df.rename(columns=lambda x: x.split('.', -1)[-1] if '.' in x else x)

相关问题