乘以关于列名的不同长度的数据帧
Multiply dataframes with differnet lengths regarding columns names
我有两个数据框,第一个 df1
只包含一行:
A B C D E
0 5 8 9 5 0
第二个有多行,但列数相同:
D C E A B
0 5 0 3 3 7
1 9 3 5 2 4
2 7 6 8 8 1
3 6 7 7 8 1
4 5 9 8 9 4
5 3 0 3 5 0
6 2 3 8 1 3
7 3 3 7 0 1
8 9 9 0 4 7
9 3 2 7 2 0
在实际示例中,我有更多列(超过 100 个)。这两个数据框具有相同的列数和相同的列名,但列的顺序不同,如示例所示。
我应该将两个数据帧相乘(matrix_like 乘法),除了我无法执行简单的 df2.values * df1.values
因为列的排序方式不同,所以例如 df1 的第二列 B 不能在 df2 的第二列相乘,因为我们在 df2 的第二列找到 C 而不是 B df2 ,而列 B 是 df2.[=14=] 中的第 5 列
考虑到列名而不是列索引,是否有简单的 pythonic 解决方案来乘以数据帧?
df1[df2.columns]
returns 列按 df2:
排序的数据框
df1
Out[91]:
A B C D E
0 3 8 9 5 0
df1[df2.columns]
Out[92]:
D C E A B
0 5 9 0 3 8
所以,您只需要:
df2.values * df1[df2.columns].values
如果您在 df2 中有额外的列,这将引发关键错误;即使您在 df1 中有更多列,它也只会 select df2 的列。
正如@MaxU 指出的那样,由于您正在对 numpy 数组进行操作,因此为了返回到数据帧结构,您需要:
pd.DataFrame(df2.values * df1[df2.columns].values, columns = df2.columns)
您可以使用 mul
, df1
is converted to Serie
by ix
:
print df1.ix[0]
A 5
B 8
C 9
D 5
E 0
Name: 0, dtype: int64
print df2.mul(df1.ix[0])
A B C D E
0 15 56 0 25 0
1 10 32 27 45 0
2 40 8 54 35 0
3 40 8 63 30 0
4 45 32 81 25 0
5 25 0 0 15 0
6 5 24 27 10 0
7 0 8 27 15 0
8 20 56 81 45 0
9 10 0 18 15 0
如果您需要更改最终 DataFrame
的顺序,请使用 reindex_axis
:
print df2.mul(df1.ix[0]).reindex_axis(df2.columns.tolist(), axis=1)
D C E A B
0 25 0 0 15 56
1 45 27 0 10 32
2 35 54 0 40 8
3 30 63 0 40 8
4 25 81 0 45 32
5 15 0 0 25 0
6 10 27 0 5 24
7 15 27 0 0 8
8 45 81 0 20 56
9 15 18 0 10 0
另一种解决方案是按 reindex
index
对 Serie
的列重新排序 df2.columns
:
print df2.mul(df1.ix[0].reindex(df2.columns))
D C E A B
0 25 0 0 15 56
1 45 27 0 10 32
2 35 54 0 40 8
3 30 63 0 40 8
4 25 81 0 45 32
5 15 0 0 25 0
6 10 27 0 5 24
7 15 27 0 0 8
8 45 81 0 20 56
9 15 18 0 10 0
我有两个数据框,第一个 df1
只包含一行:
A B C D E
0 5 8 9 5 0
第二个有多行,但列数相同:
D C E A B
0 5 0 3 3 7
1 9 3 5 2 4
2 7 6 8 8 1
3 6 7 7 8 1
4 5 9 8 9 4
5 3 0 3 5 0
6 2 3 8 1 3
7 3 3 7 0 1
8 9 9 0 4 7
9 3 2 7 2 0
在实际示例中,我有更多列(超过 100 个)。这两个数据框具有相同的列数和相同的列名,但列的顺序不同,如示例所示。
我应该将两个数据帧相乘(matrix_like 乘法),除了我无法执行简单的 df2.values * df1.values
因为列的排序方式不同,所以例如 df1 的第二列 B 不能在 df2 的第二列相乘,因为我们在 df2 的第二列找到 C 而不是 B df2 ,而列 B 是 df2.[=14=] 中的第 5 列
考虑到列名而不是列索引,是否有简单的 pythonic 解决方案来乘以数据帧?
df1[df2.columns]
returns 列按 df2:
df1
Out[91]:
A B C D E
0 3 8 9 5 0
df1[df2.columns]
Out[92]:
D C E A B
0 5 9 0 3 8
所以,您只需要:
df2.values * df1[df2.columns].values
如果您在 df2 中有额外的列,这将引发关键错误;即使您在 df1 中有更多列,它也只会 select df2 的列。
正如@MaxU 指出的那样,由于您正在对 numpy 数组进行操作,因此为了返回到数据帧结构,您需要:
pd.DataFrame(df2.values * df1[df2.columns].values, columns = df2.columns)
您可以使用 mul
, df1
is converted to Serie
by ix
:
print df1.ix[0]
A 5
B 8
C 9
D 5
E 0
Name: 0, dtype: int64
print df2.mul(df1.ix[0])
A B C D E
0 15 56 0 25 0
1 10 32 27 45 0
2 40 8 54 35 0
3 40 8 63 30 0
4 45 32 81 25 0
5 25 0 0 15 0
6 5 24 27 10 0
7 0 8 27 15 0
8 20 56 81 45 0
9 10 0 18 15 0
如果您需要更改最终 DataFrame
的顺序,请使用 reindex_axis
:
print df2.mul(df1.ix[0]).reindex_axis(df2.columns.tolist(), axis=1)
D C E A B
0 25 0 0 15 56
1 45 27 0 10 32
2 35 54 0 40 8
3 30 63 0 40 8
4 25 81 0 45 32
5 15 0 0 25 0
6 10 27 0 5 24
7 15 27 0 0 8
8 45 81 0 20 56
9 15 18 0 10 0
另一种解决方案是按 reindex
index
对 Serie
的列重新排序 df2.columns
:
print df2.mul(df1.ix[0].reindex(df2.columns))
D C E A B
0 25 0 0 15 56
1 45 27 0 10 32
2 35 54 0 40 8
3 30 63 0 40 8
4 25 81 0 45 32
5 15 0 0 25 0
6 10 27 0 5 24
7 15 27 0 0 8
8 45 81 0 20 56
9 15 18 0 10 0