Python 将索引值与列名进行比较;蟒蛇熊猫
嗨,我有两个数据帧,如下所示Python 将索引值与列名进行比较;蟒蛇熊猫,python,pandas,dataframe,Python,Pandas,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'].v
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:由于原始数据帧包含重复值,我们可以使用
Column
上的df.groupby
,使用cumcount
并将其与df['Column']
连接,在df1
中创建唯一索引。然后我们可以从数据帧df1
初始化新的数据帧df2
# 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:用于取消数据帧的锁定
# 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:使用创建布尔掩码m1
,该掩码对应于df2
中的索引
等于df2
中的列
的条件
# STEP 3
# print(m1)
[True, False, False, True, False, True, False, False, False, False, True, False, True, False, False, True]
步骤4:用于创建布尔掩码m2
,该掩码对应于df1['Column2']
中df2
的index
和column
对应的值匹配的条件
# STEP 4
# print(m2)
[True, False, True, True, False, True, False, False, True, False, True, True, True, False, True, True]
步骤5:根据[m1,m2]
中的条件,使用从[1,2]
中选择元素,否则选择默认值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:用于根据索引
和列
值重塑数据帧
# 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:用于根据df1
的索引重新索引(重新排列)df2的索引和列。然后使用删除在步骤1中添加的索引和列中的计数器部分
# 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
这是预期的工作,但在我的情况下df1“列”可以包含重复的值,我希望将所有这些重复的值作为well@SakshiGupta您能用一个例子更新这个问题吗?在这个例子中,df1列包含重复的值,并且还提供了这种情况下的预期输出。完成@shubhamSharma@SakshiGupta这将是一个复杂的场景,我将尝试提出可能的解决方案。@SakshiGupta在您预期的输出中,我想第二行应该是
3,1,3,3