簡體   English   中英

重新格式化 pandas dataframe

[英]reformat a pandas dataframe

我已經研究了一段時間我有 dataframe 看起來像這樣

tables      columns
tab1        col001
tab1        col002    
tab1        col003 
tab2        col01 
tab2        col02  
tab2        col03 

真正的有 1500 個表,一些列名是重復的,整個東西是 80,000 行乘 2 列,我試圖讓它像這樣格式化

tables      columns
tab1        col001,col002,col003
tab2        col01,col02,col03 

我嘗試了這樣的交叉表

cross_table = pd.crosstab(df['tables'], 
                      df['columns']).fillna('n/a')

但這並不完全是我想要的,它最終將所有列都作為 1 和 0,並且是一個大的稀疏矩陣

我也試過這個,但是分配 2 GiB 的錯誤讓我覺得這是不正確的

df.pivot(columns=['tables', 'columns'], values=['columns'])

我也試過 pandas 融化,但這似乎也不對

然后我嘗試將列轉換為這樣的列表

cols = list(df['columns'].unique())

df['cols'] = df['columns'].str.findall(f'({"|".join(cols)})')

我試過了,因為它以前用於提取文本,但在不同的上下文中,因為它只是將每個列名拆分為單個字符

設置:

df = pd.DataFrame({'tables': {0: 'tab1', 1: 'tab1', 2: 'tab1', 3: 'tab2', 4: 'tab2', 5: 'tab2'},
 'columns': {0: 'col001',
  1: 'col002',
  2: 'col003',
  3: 'col01',
  4: 'col02',
  5: 'col03'}})

1. 通過groupby

df = df.groupby('tables').agg(', '.join).reset_index() # Almost same as the answer in the post's comment section via @Psidom 

2. 通過pivot_table

df = df.pivot_table(index = 'tables', values = 'columns', aggfunc = ', '.join).reset_index()

3.通過list comprehension

df = pd.DataFrame([(i, ', '.join(df[df['tables'] == i]['columns']))
                   for i in df['tables'].unique()], columns=df.columns)

4. Set_index/unstack選項:

df = df.set_index('tables', append = True).unstack(0).apply(lambda x: ', '.join(x.dropna()), 1).reset_index(name = 'columns')

5. 通過pd.get_dummies

df = pd.get_dummies(df.tables).mul(df['columns'], 0).agg(', '.join).str.strip(
    ', ').reset_index(name='columns').rename({'index': 'tables'})

OUTPUT:

  tables                 columns
0   tab1  col001, col002, col003
1   tab2     col01, col02, col03

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM