假设我有关于城市的数据,其中有市长和面包师的名字(如果有的话):
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
然后,更容易计算平均年龄之类的东西。
谁能告诉我:
基本上,我可以对行进行迭代,但是我读到,对熊猫使用其他方式通常会更好(如此处所述: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
答案 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)