在pandas中的一行上有多个记录。

huangapple go评论62阅读模式
英文:

Multiple records on one row in pandas

问题

以下是翻译好的部分:

假设我有一个存储多个记录在同一行的pandas数据帧,如下所示:

id1 id2 id3 valueA1 valueA2 valueA3 valueB1 valueB2 valueB3
1 2 3 X Y Z A B C
2 1 3 P Q U S V M

我正在寻找一种通用的(任意数量的ID和相关值)方法来堆叠这些记录,以便我有:

id valueA valueB
1 X A
2 Y B
3 Z C
2 P S
1 Q V
3 U M
英文:

Suppose I have a pandas data frame that stores multiple records on the same row as below

id1 id2 id3 valueA1 valueA2 valueA3 valueB1 valueB2 valueB3
1 2 3 X Y Z A B C
2 1 3 P Q U S V M

I am looking for a generic (an arbitrary number of IDs and and associated values) way to stack these records such that I have

id valueA valueB
1 X A
2 Y B
3 Z C
2 P S
1 Q V
3 U M

答案1

得分: 2

另一个可能的解决方案:

pd.lreshape(df, {
    'id': ['id1', 'id2', 'id3'],
    'valueA': ['valueA1', 'valueA2', 'valueA3'],
    'valueB': ['valueB1', 'valueB2', 'valueB3']
})

或:

pd.lreshape(df, {
    'id': df.filter(like='id').columns.tolist(),
    'valueA': df.filter(like='valueA').columns.tolist(),
    'valueB': df.filter(like='valueB').columns.tolist()
})

输出:

   id valueA valueB
0   1      X      A
1   2      P      S
2   2      Y      B
3   1      Q      V
4   3      Z      C
5   3      U      M
英文:

Another possible solution:

pd.lreshape(df, {
    'id': ['id1', 'id2', 'id3'], 
    'valueA': ['valueA1', 'valueA2', 'valueA3'], 
    'valueB': ['valueB1', 'valueB2', 'valueB3']})

Or:

pd.lreshape(df, {
    'id': df.filter(like='id').columns.tolist(), 
    'valueA': df.filter(like='valueA').columns.tolist(), 
    'valueB': df.filter(like='valueB').columns.tolist()})

Output:

   id valueA valueB
0   1      X      A
1   2      P      S
2   2      Y      B
3   1      Q      V
4   3      Z      C
5   3      U      M

答案2

得分: 1

# 你可以生成一个 MultiIndex 和 [`stack`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.stack.html):

(df.set_axis(pd.MultiIndex.from_frame(df.columns.str.extract('(.*)((\d+)$')),
             axis=1)
 .stack()
 #.reset_index(drop=True).rename_axis(columns=None) # 可选的
)

输出:

0    id valueA valueB
  1                  
0 1   1      X      A
  2   2      Y      B
  3   3      Z      C
1 1   2      P      S
  2   1      Q      V
  3   3      U      M
英文:

You can generate a MultiIndex and stack:

(df.set_axis(pd.MultiIndex.from_frame(df.columns.str.extract('(.*)(\d+)$')),
             axis=1)
 .stack()
 #.reset_index(drop=True).rename_axis(columns=None) # optional
)

Output:

0    id valueA valueB
  1                  
0 1   1      X      A
  2   2      Y      B
  3   3      Z      C
1 1   2      P      S
  2   1      Q      V
  3   3      U      M

答案3

得分: 1

以下是使用 pd.wide_to_long() 的方法:

df = (pd.wide_to_long(df.reset_index(),
                      i='index', j='t',
                      stubnames=['id', 'valueA', 'valueB'],
                      suffix=r'.*')
                      .reset_index(drop=True))

输出结果:

   id valueA valueB
0   1      X      A
1   2      P      S
2   2      Y      B
3   1      Q      V
4   3      Z      C
5   3      U      M
英文:

Here is a way using pd.wide_to_long()

df = (pd.wide_to_long(df.reset_index(),
                      i='index',j='t',
                      stubnames=['id','valueA','valueB'],
                      suffix=r'.*')
                      .reset_index(drop=True))

Output:

   id valueA valueB
0   1      X      A
1   2      P      S
2   2      Y      B
3   1      Q      V
4   3      Z      C
5   3      U      M

huangapple
  • 本文由 发表于 2023年5月13日 21:44:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/76243036.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定