python - 是否可以连接一级和其他多级数据帧,并在轴 1 中同时具有一级和多级?(熊猫)
问题描述
我有这个一级数据框:
d = {'A': np.random.randint(0, 10, 5)
, 'B': np.random.randint(0, 10, 5)
, 'C': np.random.randint(0, 10, 5)
, 'D': np.random.randint(0, 10, 5)}
x = pd.DataFrame(d)
print(x)
A B C D
0 8 7 6 0
1 6 5 4 9
2 4 0 5 7
3 1 9 7 9
4 6 9 9 8
而这个多层次:
from functools import reduce
v = ['u','v','z']
l = ['300','350','400','450','500'] * len(v)
d = ['1','2','3','4'] * len(l)
size = len(v) * len(l) * len(d)
der_v = reduce(lambda x,y: x+y, [[i] * 20 for i in v])
der_l = reduce(lambda x,y: x+y, [[i] * 4 for i in l])
der_d = reduce(lambda x,y: x+y, [[i] for i in d])
arrays =[der_v,der_l,der_d]
y = pd.DataFrame(np.random.randint(0, 1, (5,60)),index=range(0,5), columns=arrays)
print(y)
u ... z
300 350 400 ... 400 450 500
1 2 3 4 1 2 3 4 1 2 ... 3 4 1 2 3 4 1 2 3 4
0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
[5 rows x 60 columns]
我正在尝试连接:
z = pd.concat([x, y], axis=1)
所以,我得到了这样的:
A B C D (u, 300, 1) (u, 300, 2) (u, 300, 3) (u, 300, 4) \
0 8 7 6 0 0 0 0 0 ...
1 6 5 4 9 0 0 0 0 ...
2 4 0 5 7 0 0 0 0 ...
3 1 9 7 9 0 0 0 0 ...
4 6 9 9 8 0 0 0 0 ...
但我将列作为元组,例如:(u, 300, 1)。有点奇怪!是否可能在轴 1 中同时具有一级和多级?
预期输出:
u ... z
A B C D 300 350 400 ... 400 450 500
1 2 3 4 1 2 3 4 1 2 ... 3 4 1 2 3 4 1 2 3 4
0 8 7 6 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 6 5 4 9 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
2 4 0 5 7 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 1 9 7 9 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 6 9 9 8 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
我真的不知道是否可能有一级和多级的列。所以,我希望可以切片。例如: y.loc[:,('u','500')] 工作正常。但连接后不再起作用。
解决方案
我在没有连接的情况下解决,因为在轴 1 中不可能有不同的级别。我决定使用数据框 x 中的数据作为数据框 y 中的索引。
因此,请按照以下步骤操作:
1.创建数据框x:
d = {'A': np.random.randint(0, 10, 5)
, 'B': np.random.randint(0, 10, 5)
, 'C': np.random.randint(0, 10, 5)
, 'D': np.random.randint(0, 10, 5)}
x = pd.DataFrame(d)
A B C D
0 7 1 6 8
1 4 0 5 6
2 7 5 0 7
3 8 4 3 8
4 9 1 4 0
2.创建基于数据框x的索引:
index = [x[col] for col in x.columns]
3.为数据框y创建特征:
from functools import reduce
v = ['u','v','z']
l = ['300','350','400','450','500'] * len(v)
d = ['1','2','3','4'] * len(l)
size = len(v) * len(l) * len(d)
der_v = reduce(lambda x,y: x+y, [[i] * 20 for i in v])
der_l = reduce(lambda x,y: x+y, [[i] * 4 for i in l])
der_d = reduce(lambda x,y: x+y, [[i] for i in d])
arrays =[der_v,der_l,der_d]
4.现在,要创建数据框 y,我们使用来自 x 的索引作为参数:
y = pd.DataFrame(np.random.randint(0, 1, (5,60)), columns=arrays, index=index)
y.columns = y.columns.rename(['variables', 'level','days'], level=[0,1,2])
y.index.names = ['A','B','C','D']
print(y)
variables u ... z \
level 300 350 400 ... 400 450 500
days 1 2 3 4 1 2 3 4 1 2 ... 3 4 1 2 3 4 1 2 3
A B C D ...
7 1 6 8 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
4 0 5 6 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
7 5 0 7 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
8 4 3 8 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
9 1 4 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
variables
level
days 4
A B C D
7 1 6 8 0
4 0 5 6 0
7 5 0 7 0
8 4 3 8 0
9 1 4 0 0
[5 rows x 60 columns]
推荐阅读
- javascript - 通过“/i18n/setlang/”更改语言 ajax POST 在 Firefox 上没有任何作用
- dataframe - 如果满足条件,则重命名某列中某行的某些值
- asp.net - 使用 Serilog 将日志写入文件不起作用
- c# - 公开枚举
- r - 如何将数据框形式的条件传递给 dplyr::filter
- r - 使用 R 的堆叠累积直方图/面积图
- batch-file - 批量移动不处理子文件夹
- javascript - 使用嵌套表单的 jQuery SheepIt 演示索引错误
- react-native - 如何在选项卡屏幕中访问传递给 TabNavigator 的道具?
- c++ - 如何在结构/类中调用对象的可选实例