python - 将 index 的值与列名进行比较;蟒蛇熊猫
问题描述
嗨,我有两个 Dataframe,如下所示
df1 = pd.DataFrame.from_dict(({"Column":{"0":"A","1":"B","2":"C","3":"A"},"Column2":{"0":"T1","1":"T2","2":"T1","3":"T1"}}))
然后我使用下面的语句创建了另一个数据框
df2 = pd.DataFrame(np.zeros(shape=(df1.shape[0],df1.shape[0])), columns=df1['Column'].values, index=df1['Column'].values)
现在我需要更新 df2 好像索引等于列然后分配值 1 如果索引不等于列然后检查 df1 如果该索引和列值 column2 值匹配然后分配值 2 否则分配 3
预期结果:
我们可以在不使用 for 循环的情况下实现它吗?
注意: df1 的形状和值每次都可以不同,
解决方案
利用:
# STEP 1
df1 = df1.set_index(df1['Column'] + '_' + df1.groupby('Column').cumcount().astype(str))
df2 = pd.DataFrame(np.zeros(shape=(df1.shape[0],df1.shape[0])), columns=df1.index, index=df1.index)
# STEP 2
df2 = df2.reset_index().melt('index', var_name='column')
# STEP 3:
m1 = df2['index'].str.replace(r'(_\d+)$', '').eq(df2['column'].str.replace(r'(_\d+)$', ''))
# STEP 4
m2 = df1.lookup(df2['index'], ['Column2']*df2.shape[0]) == df1.lookup(df2['column'], ['Column2'] * df2.shape[0])
# STEP 5
df2['value'] = np.select([m1, m2], [1, 2], 3)
# STEP 6:
df2 = df2.pivot('index', 'column', 'value').rename_axis(index=None, columns=None)
# STEP 7: RESULT
df2 = df2.reindex(index=df1.index, columns=df1.index)
df2.index = df2.index.str.replace(r'(_\d+)$', '')
df2.columns = df2.columns.str.replace(r'(_\d+)$', '')
脚步:
步骤 1:由于原始数据帧包含重复值,我们可以使用 use df.groupby
onColumn
和 use cumcount
and concatenate it withdf['Column']
在df1
. 然后我们可以df2
从 dataframe 初始化新的 dataframe df1
。
# STEP 1
# print(df2)
A_0 B_0 C_0 A_1
A_0 0.0 0.0 0.0 0.0
B_0 0.0 0.0 0.0 0.0
C_0 0.0 0.0 0.0 0.0
A_1 0.0 0.0 0.0 0.0
第 2 步:DataFrame.melt
用于取消透视数据框。
# STEP 2
# print(df2)
index column value
0 A_0 A_0 0.0
1 B_0 A_0 0.0
2 C_0 A_0 0.0
3 A_1 A_0 0.0
4 A_0 B_0 0.0
5 B_0 B_0 0.0
6 C_0 B_0 0.0
7 A_1 B_0 0.0
8 A_0 C_0 0.0
9 B_0 C_0 0.0
10 C_0 C_0 0.0
11 A_1 C_0 0.0
12 A_0 A_1 0.0
13 B_0 A_1 0.0
14 C_0 A_1 0.0
15 A_1 A_1 0.0
第 3 步:使用Series.equals
创建一个布尔掩码m1
,它对应于index
indf2
等于column
in的条件df2
。
# STEP 3
# print(m1)
[True, False, False, True, False, True, False, False, False, False, True, False, True, False, False, True]
第 4 步:DataFrame.lookup
用于创建一个布尔掩码m2
,该掩码对应于index
与in对应column
的值 匹配的条件。df2
df1['Column2']
# STEP 4
# print(m2)
[True, False, True, True, False, True, False, False, True, False, True, True, True, False, True, True]
STEP 5:用于根据条件从中np.select
选择元素,否则选择默认值。[1, 2]
[m1, m2]
3
# STEP 5
# print(df2)
index column value
0 A_0 A_0 1
1 B_0 A_0 3
2 C_0 A_0 2
3 A_1 A_0 1
4 A_0 B_0 3
5 B_0 B_0 1
6 C_0 B_0 3
7 A_1 B_0 3
8 A_0 C_0 2
9 B_0 C_0 3
10 C_0 C_0 1
11 A_1 C_0 2
12 A_0 A_1 1
13 B_0 A_1 3
14 C_0 A_1 2
15 A_1 A_1 1
第 6 步:用于DataFrame.pivot
根据index
和column
值重塑数据框。
# STEP 6:
# print(df2)
A_0 A_1 B_0 C_0
A_0 1 1 3 2
A_1 1 1 3 2
B_0 3 3 1 3
C_0 2 2 3 1
第 7 步:用于根据 的DataFrame.reindex
索引重新索引(重新排列)索引和列。然后使用,删除在第 1 步中添加的索引和列中的计数器部分。df2
df1
Series.str.replace
# STEP 7: RESULT
# print(df2)
A B C A
A 1 3 2 1
B 3 1 3 3
C 2 3 1 2
A 1 3 2 1
推荐阅读
- python - 修改 API 脚本以在 Python 中的 counter > x 时停止 while 循环?
- mysql - 在 Laravel 中使用 whereHas 时从子查询中选择 SUM
- html - 如何使用 webpack 将本地图像加载到 html 中的元标记
- javascript - three.js perspectiveCamera + orbitControl 我如何获得当前的“缩放”级别?
- curl - groovy 中的 curl 请求引发语法错误
- rest - 如何指示 REST API 包含给定资源的附加数据
- google-cloud-platform - GCP Dataflow vCPU 使用率和定价问题
- vuejs2 - 即使部署成功,也将 Vue.js 应用程序部署到 gitlab 页面
- c# - IsMouserOver 干扰 WPF 中的 IsSelected
- python - 基于更多数据帧的预测