嗨,我有两个如下所示的数据框
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的形状和值每次都可以不同,
答案 0 :(得分:2)
使用:
# 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+)$', '')
STEPS:
步骤1:由于原始数据帧包含重复值,因此我们可以在df.groupby
上使用Column
并使用cumcount
并将其与df['Column']
连接以创建唯一索引在df1
中。然后,我们可以从数据帧df2
中初始化新的数据帧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
中的df2
等于{{1}中的column
的条件}。
df2
第4步:使用DataFrame.lookup
创建一个布尔掩码# STEP 3
# print(m1)
[True, False, False, True, False, True, False, False, False, False, True, False, True, False, False, True]
,该布尔掩码对应于以下条件:其中对应于m2
中index
和column
的值df2
个匹配项。
df1['Column2']
第5步:使用np.select
根据# STEP 4
# print(m2)
[True, False, True, True, False, True, False, False, True, False, True, True, True, False, True, True]
的条件从[1, 2]
选择元素,否则选择默认值[m1, m2]
。
3
第6步:使用DataFrame.pivot
根据# 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
和index
的值重塑数据框。
column
第7步:使用DataFrame.reindex
根据# 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
的索引重新索引(重新排列)df2
的索引和列。然后使用Series.str.replace
,在步骤1中添加的索引和列中删除计数器部分。
df1