我有一个单编码的熊猫数据框,格式为:
df
.price-block {
width: 270px;
min-height: 450px;
margin-left: 20px;
text-align: center;
background-color: #f4f4f4;
transition: .4s ease-in-out;
}
.price-block:hover {
background-color: #000;
color: #fff;
transform: scale(1.1);
}
.price-block h3 {
margin-top: 40px;
margin-bottom: 50px;
font-size: 20px;
color: #333;
letter-spacing: 1px;
font-weight: 700;
text-transform: uppercase;
}
我想将其转换为一个新数据框,其中索引为列,并且值对应于旧索引(一种旋转数据框的方式)。我只在寻找那些在原始数据帧中具有正值(对应于计数)的旧索引。实际上, df 应如下所示:
new_df
A B C D
ID
#1 2 1 0 1
#2 1 0 0 1
#3 1 1 1 0
df = pd.DataFrame({'ID_1':['#1','#1','#3','#1'], 'ID_2':['#2','#3',np.NaN,'#2'], \
'ID_3':['#3', np.NaN, np.NaN, np.NaN] }, index=['A','B','C','D'])
我了解我需要以某种方式调整数据帧,但我找不到有效的方法来实现此目的。
答案 0 :(得分:0)
首先使用gt
使df成为布尔值,然后使用mul
,然后我们按isnull
对列进行排序。
df.gt(0).mul(df.index.values,0).T.replace('',np.nan).apply(lambda x : sorted(x,key=pd.isnull),1)
ID #1 #2 #3
A #1 #2 #3
B #1 #3 NaN
C #3 NaN NaN
D #1 #2 NaN
答案 1 :(得分:0)
您可以使用numpy中的argsort来按所需顺序获取值的位置,然后使用mask替换已排序数组中值为0的位置:
import numpy as np
arr = df.values.T
new_df = (pd.DataFrame( data = df.index[np.argsort( -arr, axis=1)].values,
index = pd.Index(df.columns,name='c_id'),
columns='ID_' + df.index.str[1:])
.mask(np.sort( -arr, axis=1) == 0,''))
那么你就得到
print(new_df)
ID_1 ID_2 ID_3
c_id
A #1 #2 #3
B #1 #3
C #3
D #1 #2