英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论