繁体   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