簡體   English   中英

Pandas:數據透視表

[英]Pandas: pivot_table

假設我有這樣一個數據幀:

data = [
    {'column1': 'asd', 'column2': 'a', 'column3': 'mileage', 'column4': 7889, 'column5': None},
    {'column1': 'fsd', 'column2': 'a', 'column3': 'temp', 'column4': 4557, 'column5': None},
    {'column1': None, 'column2': 'a', 'column3': 'string', 'column4': None, 'column5': 'value_string1'},
    {'column1': 'asd', 'column2': 'b', 'column3': 'mileage', 'column4': 5678, 'column5': None},
    {'column1': 'fsd', 'column2': 'b', 'column3': 'temp', 'column4': 5830, 'column5': None},
    {'column1': None, 'column2': 'b', 'column3': 'string', 'column4': None, 'column5': 'value_string2'},
    {'column1': None, 'column2': 'c', 'column3': 'temp', 'column4': 10, 'column5': None},
    {'column1': None, 'column2': 'c', 'column3': 'temp', 'column4': 8, 'column5': None},

]

df = pd.DataFrame(data)

    column1 column2 column3 column4 column5
0   asd       a      mileage 7889.0  None
1   fsd       a        temp  4557.0  None
2   None      a       string  NaN  value_string1
3   asd       b       mileage 5678.0 None
4   fsd       b        temp   5830.0 None
5   None      b       string  NaN  value_string2
6   None      c        temp   10.0   None
7   None      c        temp   8.0    None

我想將此 dataframe 轉換為:

        
column2 mileage temp_1  temp_2  
a       7889.0  4557.0  NaN
b       5678.0  5830.0  NaN
c        NaN    10.0    NaN
c        NaN     Nan    8.0

我嘗試使用 pandas function “數據透視表”

pivot_table = df.pivot_table(index='column2', columns='column3', values='column4')

但結果是

column3 mileage temp
column2     
a       7889.0  4557.0
b       5678.0  5830.0
c         NaN    9.0

所以這個 function 組合了第 2 列中的相等值,但如果它們在第 3 列中也具有相同的值,則第 4 列中的值將是原始表中值的平均值。

有什么辦法可以修改這個function得到我想要的結果嗎? 或者還有另一種方法嗎?

這不完全是你想要的,但看看:

>>> (df.loc[df['column4'].notna(), ['column2', 'column3', 'column4']]
       .assign(index=lambda x: x.groupby('column3').cumcount())
       .pivot_table(index=['index', 'column2'], columns='column3', values='column4')
       .reset_index('column2').rename_axis(index=None, columns=None))

  column2  mileage    temp
0       a   7889.0  4557.0
1       b   5678.0  5830.0
2       c      NaN    10.0
3       c      NaN     8.0

與@Corralien 類似的解決方案,措辭略有不同:

# create a counter for duplicate values of column2 and column3
df['cumcount'] = df.groupby(['column2', 'column3']).cumcount()
# adding pivot table
df.pivot_table(index=['column2','cumcount'],
               columns='column3',
               values='column4',
               aggfunc={'column4':['first']})

                   first        
column3          mileage    temp
column2 cumcount                
a       0         7889.0  4557.0
b       0         5678.0  5830.0
c       0            NaN    10.0
        1            NaN     8.0

前兩列是一個復合索引。

暫無
暫無

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

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