我有XLS格式的这种形式的数据:
+--------+---------+-------------+---------------+---------+
| ID | Branch | Customer ID | Customer Name | Balance |
+--------+---------+-------------+---------------+---------+
| 111111 | Branch1 | 1 | Company A | 10 |
+--------+---------+-------------+---------------+---------+
| 222222 | Branch2 | 2 | Company B | 20 |
+--------+---------+-------------+---------------+---------+
| 111111 | Branch1 | 2 | Company B | 30 |
+--------+---------+-------------+---------------+---------+
| 222222 | Branch2 | 3 | Company C | 10 |
+--------+---------+-------------+---------------+---------+
我想用熊猫来处理它。熊猫会将其读为单张纸,但我想在这里使用MultiIndex,例如
+--------+---------+-------------+---------------+---------+
| ID | Branch | Customer ID | Customer Name | Balance |
+--------+---------+-------------+---------------+---------+
| | | 1 | Company A | 10 |
+ 111111 + Branch1 +-------------+---------------+---------+
| | | 2 | Company B | 30 |
+--------+---------+-------------+---------------+---------+
| | | 2 | Company B | 20 |
+ 222222 + Branch2 +-------------+---------------+---------+
| | | 3 | Company C | 10 |
+--------+---------+-------------+---------------+---------+
此处
111111
和Branch1
是1级索引,而1
Company A
是2级索引。有内置的方法吗? 最佳答案
如果仅需要set_index
和sort_index
,请使用:
df.set_index(['ID','Branch', 'Customer ID','Customer Name'], inplace=True)
df.sort_index(inplace=True)
print (df)
Balance
ID Branch Customer ID Customer Name
111111 Branch1 1 Company A 10
2 Company B 30
222222 Branch2 2 Company B 20
3 Company C 10
但是,如果在
MultiIndex
中仅需要两个级别(在我的解决方案中为a
,b
),则需要将第一列与第二列连接,将第三列与第四列连接:df['a'] = df.ID.astype(str) + '_' + df.Branch
df['b'] = df['Customer ID'].astype(str) + '_' + df['Customer Name']
#delete original columns
df.drop(['ID','Branch', 'Customer ID','Customer Name'], axis=1, inplace=True)
df.set_index(['a','b'], inplace=True)
df.sort_index(inplace=True)
print (df)
Balance
a b
111111_Branch1 1_Company A 10
2_Company B 30
222222_Branch2 2_Company B 20
3_Company C 10
如果需要按前几列汇总最后一列,请使用
groupby
和GroupBy.mean
:df = df.groupby(['ID','Branch', 'Customer ID','Customer Name'])['Balance'].mean().to_frame()
print (df)
Balance
ID Branch Customer ID Customer Name
111111 Branch1 1 Company A 10
2 Company B 30
222222 Branch2 2 Company B 20
3 Company C 10
如果在列中使用
MultiIndex
,则tuples
需要set_index
:df.columns = pd.MultiIndex.from_arrays([['a'] * 2 + ['b']* 2 + ['c'], df.columns])
print (df)
a b c
ID Branch Customer ID Customer Name Balance
0 111111 Branch1 1 Company A 10
1 222222 Branch2 2 Company B 20
2 111111 Branch1 2 Company B 30
3 222222 Branch2 3 Company C 10
df.set_index([('a','ID'), ('a','Branch'),
('b','Customer ID'), ('b','Customer Name')], inplace=True)
df.sort_index(inplace=True)
print (df)
c
Balance
(a, ID) (a, Branch) (b, Customer ID) (b, Customer Name)
111111 Branch1 1 Company A 10
2 Company B 30
222222 Branch2 2 Company B 20
3 Company C 10
关于python - 将部分数据框转换为Pandas中的MultiIndex,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39823852/