Python Pandas将字符串拆分函数应用于索引[重复]

rqenqsqc  于 2023-09-29  发布在  Python
关注(0)|答案(1)|浏览(89)

此问题已在此处有答案

pandas dataframe return first word in string for column(5个答案)
10天前关闭。
我有一个包含邮政编码和计数的Pandas DataFrame。使用value_count创建。
DataFrame看起来像这样:

count
Postcode       
AL1 1AJ     151
AL1 1AR      36
AL1 1AS      21
AL1 1AT      12
AL1 1AU      11
...         ...
YO8 9YD      10
YO8 9YE       4
YO90 1UU      2
YO90 1WR      1
YO91 1RT      1

我正在尝试使用字符串拆分函数拆分索引列。我的目标是砍每个邮政编码,只返回第一部分。
这里有一个函数可以(应该)做什么?)那个。

def split_postcode(postcode):
    postcode_parts = postcode.split(' ')
    
    if len(postcode_parts) == 2:
        return postcode_parts[0]
    elif len(postcode_parts) == 1:
        return postcode
    else:
        print(f'unexpected postcode length: {len(postcode_parts)}')

我试着把它和

# value_count_df is the above DataFrame
value_count_df.apply(split_postcode, axis=0)

但这失败了,出现错误

ValueError: Length mismatch: Expected axis has 1 elements, new values have 2 elements

我尝试做的事情可能没有多大意义,因为如果我没记错的话,索引列是不可变的。
所以我不知道该怎么办。
很可能我创建这个DataFrame的方式比其他方法更不合适。
下面是关于如何创建value_count_df对象的一些信息。

  • 我从SQL文件中读取Postcode数据,并将所有值插入到列表中。
  • 然后我这样做了:
postcode_df = pandas.DataFrame(postcode_list)
postcode_df.columns = ['Postcode']
    
value_count = postcode_df.value_counts()
    
value_count_df = pandas.DataFrame(value_count)
value_count_df.columns = ['Postcode', 'Count']
value_count_df = value_count_df.sort_index()

# fails
value_count_df.apply(split_postcode, axis=0)

我应该如何做不同的事情,以实现一个合理的结果?
最后一个目标是将邮政编码截断到邮政编码的“第一”部分(按空格' '字符分割,并返回第一个字符串),然后获得每个唯一字符串的值计数。
我目前有价值的计数为每个唯一的邮政编码,我只是想重复这一点的“截断”邮政编码。
我可以通过从现有列表中创建一个截断的邮政编码的新列表来实现这一点,但这似乎效率很低,并且最好学习如何直接使用DataFrame中的数据来实现这一点。

wh6knrhe

wh6knrhe1#

IIUC,你可以使用简单的.str.split

first_part = df.index.str.split(" ").str[0]
print(first_part)

图纸:

Index(['AL1', 'AL1', 'AL1', 'AL1', 'AL1', 'YO8', 'YO8', 'YO90', 'YO90',
       'YO91'],
      dtype='object', name='Postcode')

如果你想要独一无二的:

print(first_part.unique())

图纸:

Index(['AL1', 'YO8', 'YO90', 'YO91'], dtype='object', name='Postcode')

如果要设置索引:

df.index = df.index.str.split(" ").str[0]
print(df)

图纸:

count
Postcode       
AL1         151
AL1          36
AL1          21
AL1          12
AL1          11
YO8          10
YO8           4
YO90          2
YO90          1
YO91          1

相关问题