簡體   English   中英

將任何其他列附加到前三列並指出它來自的三列

[英]Append any further columns to the first three columns AND indicate the triple column it comes from

這是將任何其他列附加到前三列的后續問題。

我從大約 120 列開始。 它始終是屬於彼此的三列。 與其並排放置 120 列,不如將它們堆疊在一起,因此我們最終得到了三列。 這已經解決了(見上面的鏈接)。

樣本數據:

df = pd.DataFrame({
    "1": np.random.randint(900000000, 999999999, size=5),
    "2": np.random.choice( ["A","B","C", np.nan], 5),
    "3": np.random.choice( [np.nan, 1], 5),

    "4": np.random.randint(900000000, 999999999, size=5),
    "5": np.random.choice( ["A","B","C", np.nan], 5),
    "6": np.random.choice( [np.nan, 1], 5)
})

Jezrael 建議的初始問題的工作解決方案:

arr = np.arange(len(df.columns))
df.columns = [arr // 3, arr % 3]

df = df.stack(0).sort_index(level=[1, 0]).reset_index(drop=True)
df.columns = ['A','B','C']

這改變了這個:

           1    2    3          4  5    6
0  960189042    B  NaN  991581392  A  1.0
1  977655199  nan  1.0  964195250  A  1.0
2  961771966    A  NaN  969007327  B  1.0
3  955308022    C  1.0  973316485  A  NaN
4  933277976    A  1.0  976749175  A  NaN

對此:

           A    B    C
0  960189042    B  NaN
1  977655199  nan  1.0
2  961771966    A  NaN
3  955308022    C  1.0
4  933277976    A  1.0
5  991581392    A  1.0
6  964195250    A  1.0
7  969007327    B  1.0
8  973316485    A  NaN
9  976749175    A  NaN

后續問題:現在,如果我需要一個指標,每個塊來自哪個三元組,怎么做? 所以結果可能如下所示:

           A    B    C D
0  960189042    B  NaN 0
1  977655199  nan  1.0 0
2  961771966    A  NaN 0
3  955308022    C  1.0 0
4  933277976    A  1.0 0
5  991581392    A  1.0 1
6  964195250    A  1.0 1
7  969007327    B  1.0 1
8  973316485    A  NaN 1
9  976749175    A  NaN 1

這些塊可以有不同的長度! 所以我不能簡單地添加一個計數器。

使用reset_index僅刪除第一級,第二級MultiIndex轉換為列:

arr = np.arange(len(df.columns))
df.columns = [arr // 3, arr % 3]

df = df.stack(0).sort_index(level=[1, 0]).reset_index(level=0, drop=True).reset_index()
df.columns = ['D','A','B','C']
print (df)
   D          A    B    C
0  0  960189042    B  NaN
1  0  977655199  nan  1.0
2  0  961771966    A  NaN
3  0  955308022    C  1.0
4  0  933277976    A  1.0
5  1  991581392    A  1.0
6  1  964195250    A  1.0
7  1  969007327    B  1.0
8  1  973316485    A  NaN
9  1  976749175    A  NaN

然后如果需要更改列的順序:

cols = df.columns[1:].tolist() + df.columns[:1].tolist()
df = df[cols]
print (df)
           A    B    C  D
0  960189042    B  NaN  0
1  977655199  nan  1.0  0
2  961771966    A  NaN  0
3  955308022    C  1.0  0
4  933277976    A  1.0  0
5  991581392    A  1.0  1
6  964195250    A  1.0  1
7  969007327    B  1.0  1
8  973316485    A  NaN  1
9  976749175    A  NaN  1

暫無
暫無

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

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