Python 以成对方式更新值
我有一个成对的df:Python 以成对方式更新值,python,pandas,function,apply,Python,Pandas,Function,Apply,我有一个成对的df: raw_data = {0: [5,4,6,8,9], 1: [4,8,1,2,5], 2: [42, 52, 36, 24, 73], 3: [0, 0, 0, 2, 1], 4: [2, 2, 0, 2, 0]} df = pd.DataFrame(raw_data, columns = [0,1,2,3,4]) 我想将任何0设置为其对的值,例如,第3行第0列有一个0,因此其对将位于第3列第0行,在
raw_data = {0: [5,4,6,8,9],
1: [4,8,1,2,5],
2: [42, 52, 36, 24, 73],
3: [0, 0, 0, 2, 1],
4: [2, 2, 0, 2, 0]}
df = pd.DataFrame(raw_data, columns = [0,1,2,3,4])
我想将任何0设置为其对的值,例如,第3行第0列有一个0,因此其对将位于第3列第0行,在本例中为值8
我可以通过迭代来实现:
for i in df.index:
for j in df.columns:
if df.loc[i,j] == 0:
df.loc[i,j] = df.loc[j,i]
但是它很慢。我可以应用函数或df方法来快速执行此操作吗
谢谢 使用
df
的转置将0s替换为NaNs和pd.DataFrame.fillna
df[df != 0].fillna(df.T).astype(int)
0 1 2 3 4
0 5 4 42 8 2
1 4 8 52 2 2
2 6 1 36 24 73
3 8 2 24 2 2
4 9 5 73 1 0
使用
where/mask
我们将第一个参数为True的地方置为空,并在第二个参数中用替换项填充它
df.where(df.astype(bool), df.T)
或者
还有per的建议,Numpy的等价物
pd.DataFrame(np.where(df, df, df.T), df.index, df.columns)
0 1 2 3 4
0 5 4 6 8 9
1 4 8 1 2 5
2 42 52 36 24 73
3 8 2 24 2 1
4 2 2 73 2 0
您可以通过布尔值指定它
df[df==0]=df.T
df
Out[364]:
0 1 2 3 4
0 5 4 42 8 2
1 4 8 52 2 2
2 6 1 36 24 73
3 8 2 24 2 2
4 9 5 73 1 0
啊,这太优雅了。你也可以添加numpy等价物pd.DataFrame(np.where(df==0,df.T,df))
我稍微调整了一下,忘记了numpy可以测试int的真实性(不像熊猫需要一个布尔掩码)。@LiamMcIntyre df==0这将返回布尔值,然后我们可以将值赋给真值
pd.DataFrame(np.where(df, df, df.T), df.index, df.columns)
0 1 2 3 4
0 5 4 6 8 9
1 4 8 1 2 5
2 42 52 36 24 73
3 8 2 24 2 1
4 2 2 73 2 0
df[df==0]=df.T
df
Out[364]:
0 1 2 3 4
0 5 4 42 8 2
1 4 8 52 2 2
2 6 1 36 24 73
3 8 2 24 2 2
4 9 5 73 1 0