【问题标题】:Merging multiple rows with the same index into one row将具有相同索引的多行合并为一行
【发布时间】:2021-10-23 23:15:53
【问题描述】:
我在电子表格中有一些非常脏的重复数据,我需要清理并提取一些值。基本上我将记录存储在行中,每列一条记录。一旦我达到列限制(假设在下面的示例中为 5),记录“回车”到另一组行中。
以下是数据框输出的示例:
| Index |
Unnamed 1 |
Unnamed 2 |
Unnamed 3 |
Unnamed 4 |
Unnamed 5 |
| Fruit |
Banana |
Orange |
Apple |
Grape |
Tomato |
| Colour |
Yellow |
Orange |
Green |
Green |
Red |
| Quantity |
5 |
7 |
2 |
20 |
2 |
| NaN |
NaN |
NaN |
NaN |
NaN |
NaN |
| Fruit |
Pear |
Watermelon |
NaN |
NaN |
Nan |
| Colour |
Green |
Green |
NaN |
NaN |
Nan |
| Quantity |
4 |
7 |
NaN |
NaN |
Nan |
所以你可以看到我有重复的索引。
最终我想推出一个整理这些数据的 CSV:
| Fruit |
Colour |
Quantity |
| Banana |
Yellow |
5 |
| Orange |
Orange |
7 |
| Apple |
Green |
2 |
| ... |
... |
... |
| Watermelon |
Green |
7 |
我知道如何使用 iLoc 引用行,但我需要对许多源文件重复此过程,其中确切的行号会发生变化(此数据集上方和下方存在不相关的数据)。
如何将所有水果行、颜色行、数量行连接成一组列,然后我可以转置这些列?我已经尝试过合并、加入、分组,所有常见的嫌疑人,但不太明白!
【问题讨论】:
标签:
python
pandas
dataframe
【解决方案1】:
考虑到您的初始数据帧 df,您应该删除所有带有 NAN 的行(第 1 行代码),并为您编制索引的“索引”列(第 2 行代码)。
df = df.dropna(axis=0, how='all')
df = df.set_index('Index')
由于数据框每 3 行重复一次,因此您应该使用此步骤将数据框拆分为数据框列表。转置 (.T) 使索引 - 水果、颜色和数量成为列。
n=3
list_df = [df[i:i+n].T for i in range(0,df.shape[0],n)]
最后,将列表连接回数据框,
final_df = pd.concat(list_df, ignore_index=True, axis=0)
【解决方案2】:
试试这个:
df = pd.read_clipboard()
l = []
for n, g in df.groupby(df['Index'].isna().cumsum()):
l.append(g.dropna(how='all', axis=0).set_index('Index').T)
df_out = pd.concat(l, ignore_index=True).dropna(how='all')
df_out
输出:
Index Fruit Colour Quantity
0 Banana Yellow 5
1 Orange Orange 7
2 Apple Green 2
3 Grape Green 20
4 Tomato Red 2
5 Pear Green 4
6 Watermelon Green 7
9 Nan Nan Nan
注意:最后一行是上面输入数据框中的“NaN”与“Nan”。