亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在熊貓中,如何重新排列數據框以同時組合多組列?

在熊貓中,如何重新排列數據框以同時組合多組列?

慕后森 2023-03-08 14:40:43
我希望有人能幫我解決我的問題。給定如下圖所示的熊貓數據框,我想將它重新安排到一個新的數據框中,組合幾組列(這些組的大小都相同),這樣每組就變成一個列,如下面的期望結果圖像所示。預先感謝您提供任何提示。
查看完整描述

3 回答

?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

對于一般解決方案,您可以嘗試以下兩個選項之一:

您可以嘗試這樣做,使用OrderedDict來獲取按字母順序排列的字母非數字列名稱,pd.DataFrame.filter以過濾具有相似名稱的列,然后使用以下值連接值pd.DataFrame.stack

import pandas as pd

from collections import OrderedDict


df = pd.DataFrame([[0,1,2,3,4],[5,6,7,8,9]], columns=['a1','a2','b1','b2','c'])



newdf=pd.DataFrame()


for col in list(OrderedDict.fromkeys( ''.join(df.columns)).keys()):

    if col.isalpha():

        newdf[col]=df.filter(like=col, axis=1).stack().reset_index(level=1,drop=True)

newdf=newdf.reset_index(drop=True)

輸出:


df

   a1  a2  b1  b2  c

0   0   1   2   3  4

1   5   6   7   8  9


newdf

   a  b  c

0  0  2  4

1  1  3  4

2  5  7  9

3  6  8  9

獲取列名的另一種方法是使用reand setlike this,然后按字母順序對列進行排序:


newdf=pd.DataFrame()

import re

for col in set(re.findall('[^\W\d_]',''.join(df.columns))):

    newdf[col]=df.filter(like=col, axis=1).stack().reset_index(level=1,drop=True)

newdf=newdf.reindex(sorted(newdf.columns), axis=1).reset_index(drop=True)

輸出:


newdf

   a  b  c

0  0  2  4

1  1  3  4

2  5  7  9

3  6  8  9


查看完整回答
反對 回復 2023-03-08
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

您可以使用pd.wide_to_long和rename“c”列執行此操作:


df_out = pd.wide_to_long(df.reset_index().rename(columns={'c':'c1'}),

                         ['a','b','c'],'index','no')

df_out = df_out.reset_index(drop=True).ffill().astype(int)

df_out

輸出:


   a  b  c

0  0  2  4

1  1  3  4

2  5  7  9

3  6  8  9

相同的數據框只是排序不同。


pd.wide_to_long(df,  ['a','b'], 'c', 'no').reset_index().drop('no', axis=1)

輸出:


   c  a  b

0  4  0  2

1  9  5  7

2  4  1  3

3  9  6  8


查看完整回答
反對 回復 2023-03-08
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

c 列只有一列,而其他字母有兩列,這一事實讓它變得有點棘手。我首先堆疊數據框并去掉列名中的數字。然后對于 a 和 b,我旋轉了一個數據框并刪除了所有 nans。對于 c,我將數據幀的長度乘以 2 使其與 a 和 b 匹配,然后將其與 a 和 b 合并。


輸入:


import pandas as pd

df = pd.DataFrame({'a1': {0: 0, 1: 5},

 'a2': {0: 1, 1: 6},

 'b1': {0: 2, 1: 7},

 'b2': {0: 3, 1: 8},

 'c': {0: 4, 1: 9}})

df

代碼:


df1=df.copy().stack().reset_index().replace('[0-9]+', '', regex=True)

dfab = df1[df1['level_1'].isin(['a','b'])].pivot(index=0, columns='level_1', values=0) \

                         .apply(lambda x: pd.Series(x.dropna().values)).astype(int)

dfc = pd.DataFrame(np.repeat(df['c'].values,2,axis=0)).rename({0:'c'}, axis=1)

df2=pd.merge(dfab, dfc, how='left', left_index=True, right_index=True)

df2

輸出:


    a   b   c

0   0   2   4

1   1   3   4

2   5   7   9

3   6   8   9


查看完整回答
反對 回復 2023-03-08
  • 3 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號