Pandas:将行转换为列

ggazkfy8  于 2022-12-09  发布在  其他
关注(0)|答案(4)|浏览(172)

下面是我的数据的最小示例:

Id name class_cd class_name
0   1    A     abc1        dog
1   1    A     def2     canine
2   1    A     ghi1       safe
3   2    B     abc1        cat
4   2    B     def2      tabby

可复制:

df = pd.DataFrame({
    'Id': [1, 1, 1, 2, 2],
    'name':['A', 'A', 'A', 'B', 'B'],
    'class_cd': ['abc1', 'def2', 'ghi1', 'abc1', 'def2'],
    'class_name': ['dog', 'canine', 'safe', 'cat', 'tabby']
})

我希望class_cd非重复值成为新的列,其中值是关联的class_name,这样结果中每个id对应一行。
预期成果:

Id  name    abc1    def2    ghi1
0   1      A     dog  canine    safe
1   2      B     cat   tabby

Pandas怎么能做到这一点呢?

agxfikkp

agxfikkp1#

这是pivot的工作。
您告诉它要展开哪些列,以及要在这些新列中放入哪些值。它将使用指定索引中的唯一值在结果中创建行。

>>> df.pivot(index=['Id','name'], columns='class_cd', values='class_name')
class_cd abc1    def2  ghi1
Id name
1  A      dog  canine  safe
2  B      cat   tabby   NaN

然后,可以调用reset_index()将多索引扁平化为列。

class_cd  Id name abc1    def2  ghi1
0          1    A  dog  canine  safe
1          2    B  cat   tabby   NaN
eit6fx6z

eit6fx6z2#

您可以尝试:

(df.pivot(index=['Id', 'name'], columns='class_cd', values='class_name')
 .fillna('')
 .reset_index())

class_cd  Id name abc1    def2  ghi1
0          1    A  dog  canine  safe
1          2    B  cat   tabby
ndh0cuux

ndh0cuux3#

使用**crosstab:**作为替代

dfx=pd.crosstab([df['Id'],df['name']], df['class_cd'],values=df['class_name'],aggfunc=','.join)

输出

abc1    def2  ghi1
Id name                    
1  A      dog  canine  safe
2  B      cat   tabby   NaN
7z5jn7bk

7z5jn7bk4#

我想通过Pandas和sql 1.import sql来做

!pip install pandasql

from pandasql import sqldf
pysqldf = lambda q: sqldf(q, globals())

从class_cd中取出 Dataframe

df1=df[df['class_cd']=='abc1']
df2=df[df['class_cd']=='def2']
df3=df[df['class_cd']=='ghi3']

1.使用sql连接三个表

query="""
select tt1.Id, tt1.name, tt1.abc1,tt1.def2, t3.class_name as 'ghi3'
from
(select t1.Id,t1.name,t1.class_name as 'abc1', t2.class_name as 'def2'
from df1 as t1 
join df2 as t2 
on t1.name=t2.name) as tt1

left join df3 as t3
on tt1.name = t3.name 

"""

4.outcome

df_result=pysqldf(query)
print(df_result)

相关问题