将值转换为列

时间:2019-09-10 16:38:34

标签: python pandas numpy

对于模糊的问题名称表示歉意,但我不确定如何调用此操作。

我有以下数据框:

import pandas as pd

df = pd.DataFrame({
    'A': [1, 3, 2, 1, 2],
    'B': [2, 1, 3, 2, 3],
    'C': [3, 2, 1, 3, 1],
})
print(df)
#    A  B  C
# 0  1  2  3
# 1  3  1  2
# 2  2  3  1
# 3  1  2  3
# 4  2  3  1

此数据代表每行每个选项ABC的“排名”。因此,例如,在行2中,C是最好的,然后是A,然后是B。我想构造一个“倒置”数据框,其中对于每一行,我有三列用于排名的123,其中{{1 }},AB现在是数据。因此,对于上面的示例,结果将是:

C

理想情况下,out = pd.DataFrame({ 1: ['A', 'B', 'C', 'A', 'C'], 2: ['B', 'C', 'A', 'B', 'A'], 3: ['C', 'A', 'B', 'C', 'B'], }) print(out) # 1 2 3 # 0 A B C # 1 B C A # 2 C A B # 3 A B C # 4 C A B 中的每一行应具有三个不同的值df12,但可能会有重复值的情况(超出该范围的值无需考虑)。如果可能的话,我想通过在相同位置“连接”选项名称并在缺少位置使用空字符串或NaN来解决此问题。例如,使用以下输入:

3

理想情况下,我希望获得此输出:

df_bad = pd.DataFrame({'A': [1], 'B': [2], 'C': [2]})
print(df_bad)
#    A  B  C
# 0  1  2  2

或者,我可以选择只获取其中一个值而不是并置。

我一直在浏览meltpivotpivot_table和其他功能,但是我不知道要得到想要的结果的方法。

5 个答案:

答案 0 :(得分:8)

您可以使用Kernel#untrace_var

#ruby --disable-gems --disable-did_you_mean -e'puts Kernel.private_instance_methods(false).sort'
Array
Complex
Float
Hash
Integer
Rational
String
__callee__
__dir__
__method__
`
abort
at_exit
autoload
autoload?
binding
block_given?
caller
caller_locations
catch
eval
exec
exit
exit!
fail
fork
format
gets
global_variables
initialize_clone
initialize_copy
initialize_dup
iterator?
lambda
load
local_variables
loop
open
p
pp
print
printf
proc
putc
puts
raise
rand
readline
readlines
require
require_relative
respond_to_missing?
select
set_trace_func
sleep
spawn
sprintf
srand
syscall
system
test
throw
trace_var
trap
untrace_var
warn

X-Source-Language: de

答案 1 :(得分:7)

这是stack

的一种方法
if

答案 2 :(得分:6)

您的第一个示例可以使用argsort和索引来有效解决。


m = np.argsort(df.to_numpy(), 1)

df.columns.to_numpy()[m]

array([['A', 'B', 'C'],
       ['B', 'C', 'A'],
       ['C', 'A', 'B'],
       ['A', 'B', 'C'],
       ['C', 'A', 'B']], dtype=object)

第二个示例有些棘手,但还是有一个主意,我将稍后进行更新。

答案 3 :(得分:6)

另一种方式:

df = pd.DataFrame({
    'A': [1, 3, 2, 1, 2],
    'B': [2, 1, 3, 2, 3],
    'C': [3, 2, 1, 2, 1],
})

(df.stack()
   .reset_index()
   .groupby(['level_0',0])
   .level_1.apply(''.join)
   .unstack()
)

输出:

0        1   2    3
level_0            
0        A   B    C
1        B   C    A
2        C   A    B
3        A  BC  NaN
4        C   A    B

答案 4 :(得分:5)

对于重复排名的情况(例如第二个示例),在最后一步使用pivotunstack的任何解决方案都将失败。您需要pivot_tablecrosstab。正如您已经找到了使用pivot_table的解决方案。这是crosstab

df2 = df_bad.stack().reset_index(1, name='cols')
pd.crosstab(index=df2.index, columns=df2.cols, values=df2.level_1,
                             aggfunc=''.join).fillna('')

Out[171]:
cols   1   2
row_0
0      A  BC

使用stackpivot

df.stack().reset_index(1, name='cols').pivot(columns='cols', values='level_1')

Out[131]:
cols  1  2  3
0     A  B  C
1     B  C  A
2     C  A  B
3     A  B  C
4     C  A  B