通过拆分行创建新的熊猫数据框

时间:2020-06-29 13:41:02

标签: python pandas dataframe

假设我有关于城市的数据,其中有市长和面包师的名字(如果有的话):

        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. 我应该和熊猫一起工作吗?

基本上,我可以对行进行迭代,但是我读到,对熊猫使用其他方式通常会更好(如此处所述:How to iterate over rows in a DataFrame in Pandas)。

我对熊猫并不陌生,但仍然陷入“麻木数组”的思维方式。

如果需要,这里是我举两个例子的方式:

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

3 个答案:

答案 0 :(得分:2)

您可以尝试使用pd.wide_to_long

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')]

答案 1 :(得分:1)

这是使用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

答案 2 :(得分:1)

在大多数情况下,使用熊猫时,最好使用其build it方法来修改数组:

template <typename L, typename R> 
auto getsum (L l, R r) // <<--- no more tailing return type!!!
 { return l + r; }

输出:

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)