python - 如何从现有数据框中创建一个 dataframe,其中很少有列作为 rows 附加?

我有一个如下数据框:

data = {'Age': [20, 30, 19, 21],'city1':['ny','nj','ln','tampa'],'country1':['usa','usa','usa','usa'],'city2':['london','edinburg',np.nan,'tampa'],
        'country2':['uk','uk','uk','usa'],
        'city1':['ny','london',np.nan,np.nan],'country2':['usa','uk',np.nan,np.nan]}  
df1=pd.DataFrame(data)
print(df1)
    Age city1   country1    city2   country2
0   20  ny      usa        london    usa
1   30  london  usa        edinburg  uk
2   19  NaN     usa        NaN       NaN
3   21  NaN     usa        tampa     NaN

现在我想创建一个新的数据框,其中 age 列 values 根据离开 age 列的列数的一半重复。在上面留下年龄列的数据框中,有四列的一半是 2。因此,年龄列 values 必须重复两次。一旦形成了新的年龄列,那么我需要附加 city1, country1 有一个 row 和 city2,country2 作为第二个 row(类似于例外输出中所示的内容)。尽管我能够将 values 重复为 list 并尝试从其他列中将 values 作为 list 并附加为 rows ,如下所示:-

code:-
#for repeating the value.
main_list = np.repeat(df1['Age'],2)
#for getting the column values 
r=[]
for i in range(len(df1)):
    r.append(df1.iloc[:,1:3].loc[i].values.tolist())
print(r)
[['ny', 'usa'], ['london', 'usa'], [nan, 'usa'], [nan, 'usa']]

但正如您所看到的,它只为 city1,country1 提供 values 而不是为 city2,country2 提供错误,当将 list r values 作为 rows 附加到新数据帧时,如下所示:-

newdata = {'Age':main_list}
res=pd.DataFrame(newdata)
print(res)
   Age
0   20
0   20
1   30
1   30
2   19
2   19
3   21
3   21

res.loc[len(res)] = r
print(res)
ValueError: cannot set a row with mismatched columns

如何获得 values 的例外 list 并创建如下数据框:-

例外输出:-

r =[['ny', 'usa'], ['london', 'usa'],['london', 'usa'],['edinburg','uk'],
                     [nan, 'usa'],[nan,nan],[nan, 'usa'],['tampa',nan]]

最终数据框:-

Age  city     country
0   20  'ny'     'usa'
0   20  'london' 'usa'
1   30  'london' 'usa'
1   30  'edinburg''uk'
2   19   NaN     'usa'
2   19   NaN      NaN
3   21   NaN     'usa'
3   21  'tampa'  NaN

回答1

您还可以使用 janitor 提供的函数 pivot_longer

import janitor
df1.pivot_longer('Age', names_to = ['.value', 'group'], names_pattern = '(\\D+)(\\d+)')

   Age group      city country
0   20     1        ny     usa
1   30     1    london     usa
2   19     1       NaN     usa
3   21     1       NaN     usa
4   20     2    london     usa
5   30     2  edinburg      uk
6   19     2       NaN     NaN
7   21     2     tampa     NaN

回答2

您可以使用 https://pandas.pydata.org/docs/reference/api/pandas.wide_to_long.html

(pd
 .wide_to_long(df1.reset_index(),
               stubnames=['city', 'country'], i=['index', 'Age'], j='id')
 .droplevel(-1)
 .reset_index('Age')
)

输出:

Age      city country
index                       
0       20        ny     usa
0       20    london     usa
1       30    london     usa
1       30  edinburg      uk
2       19       NaN     usa
2       19       NaN     NaN
3       21       NaN     usa
3       21     tampa     NaN

相似文章

html - 使 div 内的内容可以滚动

我有一个类似于下面的代码片段的设置。我的目标是将“蓝色”和“黄色”div固定在适当的位置,而“蓝色”div如果包含的行数超过可用空间,则必须是可滚动的。由于代码的性质,我无法更改正文中div的位置,也...

postgresql - Postgres 视图需要很长时间才能执行

我创建了一个视图,之后我用它来生成一些报告。第一次创建它时,我曾经有少量数据,并没有注意到任何问题。该视图现在需要永远加载并导致许多性能问题。我试图以这种方式限制视图:WHEREdate_part('...