通过拆分行创建新的数据帧

2024-10-02 08:29:05 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有关于市长和面包师姓名的城市的数据(如果有):

        city name_mayor age_mayor name_baker age_baker
0  Cherbourg     Robert        10       Jack        40
1     Calais     Michel        20     Russel        50
2     Nevers        Guy        30       None      None

然后,我想创建一个新的数据框架来处理个人,因此我想要这样一个数据框架:

        city    name  age
0  Cherbourg  Robert   10
1     Calais  Michel   20
2     Nevers     Guy   30
3  Cherbourg    Jack   40
4     Calais  Russel   50

那么,计算平均年龄之类的东西就更容易了

谁能告诉我:

  1. 我怎样才能做到
  2. 我应该和熊猫一起工作吗

基本上,我可以通过行上的迭代来完成,但我了解到,使用其他方式处理pandas通常更好(如这里所述:How to iterate over rows in a DataFrame in Pandas

我对熊猫并不陌生,但仍然停留在一种“numpy数组”的思维方式中

如果需要,这里是我如何制作我的两个示例:

data_1 = { "city" : ["Cherbourg", "Calais", "Nevers"], "name_mayor" : ["Robert", "Michel", "Guy"], "age_mayor" : [10,20,30], "name_baker" : ["Jack", "Russel"], "age_baker" : [40,50]}
df_1 = pd.DataFrame.from_dict(data_1, orient='index').transpose()
data_2 = {0:["Cherbourg", "Robert", 10], 1:["Calais", "Michel", 20], 2:["Nevers", "Guy", 30], 3:["Cherbourg", "Jack", 40], 4:["Calais", "Russel", 50]  }
df_2 = pd.DataFrame.from_dict(data_2, orient='index', columns=["city", "name", "age"])

谢谢! R


Tags: 数据namecityagedatarobertjackbaker
3条回答

下面是使用concat的另一种方法:

df.set_index('city', inplace=True)
df = pd.concat([df[['name_mayor', 'age_mayor']], df[['name_baker', 'age_baker']]]).rename(columns={'name_baker': 'name', 'name_mayor': 'name', 'age_mayor': 'age', 'age_baker': 'age'})
df = df.groupby(level=0, axis=1).first().reset_index()

        city   age    name
0  Cherbourg    10  Robert
1     Calais    20  Michel
2     Nevers    30     Guy
3  Cherbourg    40    Jack
4     Calais    50  Russel
5     Nevers  None    None

大多数情况下,使用panda时,最好使用其build-it方法修改阵列:

import pandas as pd
my_dict = {'city': ['Cherbourg', 'Calais', 'Nevers'], 'name_mayor': ['Robert', 'Michel', 'Guy'],
           'age_mayor': [10, 20, 30], 'name_baker': ['Jack', 'Russel', None], 'age_baker': [40, 50, None]}
my_data_frame = pd.DataFrame(my_dict)
new_data_frame = pd.DataFrame({'city': my_data_frame['city'].append(my_data_frame['city']), 'name': my_data_frame['name_mayor'].append(
    my_data_frame['name_baker']), 'age': my_data_frame['age_mayor'].append(my_data_frame['age_baker'])})
new_data_frame.dropna(inplace=True)
print(new_data_frame)

输出:

        city    name   age
0  Cherbourg  Robert  10.0
1     Calais  Michel  20.0
2     Nevers     Guy  30.0
0  Cherbourg    Jack  40.0
1     Calais  Russel  50.0

您可以尝试使用^{}

s=pd.wide_to_long(df,['name','age'],i='city',j='drop',sep='_', suffix='\\w+').reset_index()
        city   drop    name   age
0  Cherbourg  mayor  Robert    10
1     Calais  mayor  Michel    20
2     Nevers  mayor     Guy    30
3  Cherbourg  baker    Jack    40
4     Calais  baker  Russel    50
5     Nevers  baker    None  None

s=s[s['name'].ne('None')]

相关问题 更多 >

    热门问题