我正在尝试生成数据透视表结构,但只能从两列数据中生成。我所拥有的是这个通用DataFrame;
df = pd.DataFrame({'name': ['Australia', 'Japan', 'Brazil'], 'code': ['R1', 'R2', 'R3']})
我想要实现的是在列和索引中都有name
字段,以及来自code
字段的连接字符串的值。这将导致DataFrame具有形状(3,3)。基本上在Australia
行和Japan
列中包含R1-R2
的值,在Brazil
行和Australia
列中包含R3-R1
的值。
我尝试使用此功能,但我不确定pivot_table
是否可以在索引和列中使用相同的值。
pd.pivot_table(df, values='code', index=['name'], columns=['name'], aggfunc=lambda x: '-'.join(x))
基本上,输出应该是这种形式(尽管可能有索引和列名)而不是手动生成;
data = {'Australia': ['R1-R1', 'R2-R1', 'R3-R1'],
'Japan': ['R1-R2', 'R2-R2', 'R3-R2'],
'Brazil': ['R1-R3', 'R2-R3', 'R3-R3']}
df_result = pd.DataFrame(data, columns=['Australia', 'Japan', 'Brazil'], index=['Australia', 'Japan', 'Brazil'])
谢谢!
答案 0 :(得分:1)
One way, you could do this:
df1 = df.assign(key=1).merge(df.assign(key=1), how='outer',on='key',suffixes=('','_c'))
df1 = df1.drop('key',axis=1)
df1['value'] = df1['code'] + '-' + df1['code_c']
df2 = df1.drop(['code','code_c'],axis=1)
df_result = df2.set_index(['name','name_c']).unstack()
df_result.columns = df_result.columns.droplevel()
print(df_result)
Output:
name_c Australia Brazil Japan
name
Australia R1-R1 R1-R3 R1-R2
Brazil R3-R1 R3-R3 R3-R2
Japan R2-R1 R2-R3 R2-R2