pandas 数据帧之间的矩阵乘法
Matrix multiplication between pandas dataframe
我正在尝试查找数据框和列向量(另一个数据框)之间的点积。
数据框如下所示:
df = pd.DataFrame([
[0,23,0, 0, 1,0],
[1,33,1, 0, 0,0],
[2,40,1, 0, 1,1]],
columns=['SN','Age', 'Nice_540', 'Nice_200', 'Nice_153','Nice_124'])
SN |Age |Nice_540 |Nice_200| Nice_153|Nice_124|
----|-----|--------|--------|----------|--------|
0 | 23 | 0 | 0 | 1 | 0 |
1 | 33 | 1 | 0 | 0 | 0 |
2 | 40 | 1 | 0 | 1 | 1 |
我希望行矩阵乘以最后四列标题的数字(540;200 等),以便最后一列“FINAL”在矩阵乘法后看起来像这样:
SN | Age |Nice_540 |Nice_200| Nice_153|Nice_124|FINAL |
----|-----|--------|--------|----------|--------|--------|
0 | 23 | 0 | 0 | 1 | 0 | 153 |
1 | 33 | 1 | 0 | 0 | 0 | 540 |
2 | 40 | 1 | 0 | 1 | 1 | 817 |
我猜对了最后一列的前两个数字(153 和 540);但对于最后一个,我得到的是 540153124,而不是点积所期望的 817。
这是我目前所做的:
AAAA = df.columns.to_list()
AAAA = str(AAAA)
string_pattern = r"\d{3}"
regex_pattern = re.compile(string_pattern)
BBBB = regex_pattern.findall(AAAA)
cols=df.filter(regex='Nice_',axis=1).columns
seR = pd.DataFrame(BBBB,index=cols)
df["FINAL"] = df[cols].dot(seR)
我得到 540153124 而不是 817 做错了什么?提前致谢。
你可以这样做:
d = df.filter(like='Nice_')
vals = d.columns.str.split('_').str[-1].astype(int)
df['FINAL'] = d.dot(vals)
输出:
SN Age Nice_540 Nice_200 Nice_153 Nice_124 FINAL
0 0 23 0 0 1 0 153
1 1 33 1 0 0 0 540
2 2 40 1 0 1 1 817
我正在尝试查找数据框和列向量(另一个数据框)之间的点积。 数据框如下所示:
df = pd.DataFrame([
[0,23,0, 0, 1,0],
[1,33,1, 0, 0,0],
[2,40,1, 0, 1,1]],
columns=['SN','Age', 'Nice_540', 'Nice_200', 'Nice_153','Nice_124'])
SN |Age |Nice_540 |Nice_200| Nice_153|Nice_124|
----|-----|--------|--------|----------|--------|
0 | 23 | 0 | 0 | 1 | 0 |
1 | 33 | 1 | 0 | 0 | 0 |
2 | 40 | 1 | 0 | 1 | 1 |
我希望行矩阵乘以最后四列标题的数字(540;200 等),以便最后一列“FINAL”在矩阵乘法后看起来像这样:
SN | Age |Nice_540 |Nice_200| Nice_153|Nice_124|FINAL |
----|-----|--------|--------|----------|--------|--------|
0 | 23 | 0 | 0 | 1 | 0 | 153 |
1 | 33 | 1 | 0 | 0 | 0 | 540 |
2 | 40 | 1 | 0 | 1 | 1 | 817 |
我猜对了最后一列的前两个数字(153 和 540);但对于最后一个,我得到的是 540153124,而不是点积所期望的 817。
这是我目前所做的:
AAAA = df.columns.to_list()
AAAA = str(AAAA)
string_pattern = r"\d{3}"
regex_pattern = re.compile(string_pattern)
BBBB = regex_pattern.findall(AAAA)
cols=df.filter(regex='Nice_',axis=1).columns
seR = pd.DataFrame(BBBB,index=cols)
df["FINAL"] = df[cols].dot(seR)
我得到 540153124 而不是 817 做错了什么?提前致谢。
你可以这样做:
d = df.filter(like='Nice_')
vals = d.columns.str.split('_').str[-1].astype(int)
df['FINAL'] = d.dot(vals)
输出:
SN Age Nice_540 Nice_200 Nice_153 Nice_124 FINAL
0 0 23 0 0 1 0 153
1 1 33 1 0 0 0 540
2 2 40 1 0 1 1 817