通过在其他 DataFrame 中搜索索引和列名来用值填充矩阵
Fill matrix with value by searching for index and column names in other DataFrame
我有一个“空”数据框,如下所示:
6807 6809 5341
126293 nan nan nan
126294 nan nan nan
126295 nan nan nan
列名给出 name_id
而索引值给出 file_id
。现在我想在名为 pro
、cont
和 neutral
的单独 pandas 数据框中搜索 file_id
和 name_id
,它们看起来像这个:
file_id name_id
0 126293 7244
1 126293 4978
2 126293 5112
3 126293 6864
如果我在 pro
数据框中找到 file_id
和 name_id
我想用 1
填充上面的空数据框单元格,当在 cont
then -1
when in neutral
,那么输入矩阵的值应该是0
。给我这样的结果,例如:
6807 6809 5341
126293 1 -1 0
126294 0 -1 0
126295 1 -1 1
有人知道怎么做吗?
这是一种方法,使用在 pro
、neutral
和 cont
[=16= 中找到的 file_id
和 name_id
的交集] 作为索引来设置您想要的值 1、0 或 -1。我使用 Python set
class 来执行交集。但是,它不能很好地索引到 DataFrame
,因为它会导致 tuple
.
编辑:2022 年 1 月 29 日
我错过了我之前解决方案中的一个重要步骤。需要使用 itertools 产品才能获得 df.index
和 df.columns
组合的所有排列。请参阅下面的更新代码。
from itertools import product
pro_idx = set(product(df.index, df.columns)).intersection(zip(pro['file_id'], pro['name_id']))
neut_idx = set(product(df.index, df.columns)).intersection(zip(neutral['file_id'], neutral['name_id']))
cont_idx = set(product(df.index, df.columns)).intersection(zip(cont['file_id'], cont['name_id']))
if any(pro_idx):
for f,n in pro_idx:
df.loc[f,n] = 1
if any(neut_idx):
for f,n in neut_idx:
df.loc[f,n] = 0
if any(cont_idx):
for f,n in cont_idx:
df.loc[f,n] = -1
您可以堆叠 'empty' df(我们称它为 df
)并合并 pro
、con
和 neu
的组合。然后你可以re-arrange把它变回二维形状
将投票放在一个数据框中:
votes = pd.concat([pro.assign(v=1), con.assign(v=-1), neu.assign(v=0)])
votes['name_id'] = votes['name_id'].astype(str) # you may or may not have to do this depending on what type your actual df is, as I have no way of knowing. It should match the type from columns in the empty df
votes
现在看起来像这样(我编的数字):
file_id name_id v
0 126293 6807 1
1 126293 4978 1
2 126293 5112 1
3 126293 6864 1
0 126295 6809 -1
0 126294 5341 0
现在我们将它合并到 name_id 和 file_id 上的堆叠 df
:
df1 = (df.unstack()
.reset_index()
.merge(votes, left_on = ['level_0','level_1'],
right_on = [ 'name_id','file_id'], how='left')[['level_0', 'level_1', 'v']]
)
df1
长得像
level_0 level_1 v
0 6807 126293 1.0
1 6807 126294 NaN
2 6807 126295 NaN
3 6809 126293 NaN
4 6809 126294 NaN
5 6809 126295 -1.0
6 5341 126293 NaN
7 5341 126294 0.0
8 5341 126295 NaN
现在unstack
回来
df1.set_index(['level_1','level_0']).unstack()
输出:
v
level_0 5341 6807 6809
level_1
126293 NaN 1.0 NaN
126294 0.0 NaN NaN
126295 NaN NaN -1.0
如果您在赞成或反对中都没有投票,就会得到 NaN。那些最初不存在于 df
中的 file_id/name_id 的 dfs 中的投票被忽略
我有一个“空”数据框,如下所示:
6807 6809 5341
126293 nan nan nan
126294 nan nan nan
126295 nan nan nan
列名给出 name_id
而索引值给出 file_id
。现在我想在名为 pro
、cont
和 neutral
的单独 pandas 数据框中搜索 file_id
和 name_id
,它们看起来像这个:
file_id name_id
0 126293 7244
1 126293 4978
2 126293 5112
3 126293 6864
如果我在 pro
数据框中找到 file_id
和 name_id
我想用 1
填充上面的空数据框单元格,当在 cont
then -1
when in neutral
,那么输入矩阵的值应该是0
。给我这样的结果,例如:
6807 6809 5341
126293 1 -1 0
126294 0 -1 0
126295 1 -1 1
有人知道怎么做吗?
这是一种方法,使用在 pro
、neutral
和 cont
[=16= 中找到的 file_id
和 name_id
的交集] 作为索引来设置您想要的值 1、0 或 -1。我使用 Python set
class 来执行交集。但是,它不能很好地索引到 DataFrame
,因为它会导致 tuple
.
编辑:2022 年 1 月 29 日
我错过了我之前解决方案中的一个重要步骤。需要使用 itertools 产品才能获得 df.index
和 df.columns
组合的所有排列。请参阅下面的更新代码。
from itertools import product
pro_idx = set(product(df.index, df.columns)).intersection(zip(pro['file_id'], pro['name_id']))
neut_idx = set(product(df.index, df.columns)).intersection(zip(neutral['file_id'], neutral['name_id']))
cont_idx = set(product(df.index, df.columns)).intersection(zip(cont['file_id'], cont['name_id']))
if any(pro_idx):
for f,n in pro_idx:
df.loc[f,n] = 1
if any(neut_idx):
for f,n in neut_idx:
df.loc[f,n] = 0
if any(cont_idx):
for f,n in cont_idx:
df.loc[f,n] = -1
您可以堆叠 'empty' df(我们称它为 df
)并合并 pro
、con
和 neu
的组合。然后你可以re-arrange把它变回二维形状
将投票放在一个数据框中:
votes = pd.concat([pro.assign(v=1), con.assign(v=-1), neu.assign(v=0)])
votes['name_id'] = votes['name_id'].astype(str) # you may or may not have to do this depending on what type your actual df is, as I have no way of knowing. It should match the type from columns in the empty df
votes
现在看起来像这样(我编的数字):
file_id name_id v
0 126293 6807 1
1 126293 4978 1
2 126293 5112 1
3 126293 6864 1
0 126295 6809 -1
0 126294 5341 0
现在我们将它合并到 name_id 和 file_id 上的堆叠 df
:
df1 = (df.unstack()
.reset_index()
.merge(votes, left_on = ['level_0','level_1'],
right_on = [ 'name_id','file_id'], how='left')[['level_0', 'level_1', 'v']]
)
df1
长得像
level_0 level_1 v
0 6807 126293 1.0
1 6807 126294 NaN
2 6807 126295 NaN
3 6809 126293 NaN
4 6809 126294 NaN
5 6809 126295 -1.0
6 5341 126293 NaN
7 5341 126294 0.0
8 5341 126295 NaN
现在unstack
回来
df1.set_index(['level_1','level_0']).unstack()
输出:
v
level_0 5341 6807 6809
level_1
126293 NaN 1.0 NaN
126294 0.0 NaN NaN
126295 NaN NaN -1.0
如果您在赞成或反对中都没有投票,就会得到 NaN。那些最初不存在于 df
中的 file_id/name_id 的 dfs 中的投票被忽略