将index的值与列名进行比较;蟒蛇熊猫

时间:2020-06-15 08:09:41

标签: 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"}}))

df1

然后我使用下面的语句创建了另一个数据框

df2 = pd.DataFrame(np.zeros(shape=(df1.shape[0],df1.shape[0])), columns=df1['Column'].values, index=df1['Column'].values)

df2

现在我需要更新df2,就像索引等于列,然后如果索引不等于列,则分配值1,然后在df1中检查该索引和列值column2的值是否匹配,然后分配值2,否则分配3

预期结果:

result

我们可以不使用for循环来实现它吗?

注意:df1的形状和值每次都可以不同,

1 个答案:

答案 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] ,该布尔掩码对应于以下条件:其中对应于m2indexcolumn的值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