我有成对的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])
我想设置任意零到它的对的值,例如在col 0第3行是0,所以它的对将是col 3 row 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方法快速完成此操作吗?
谢谢!
答案 0 :(得分:3)
使用pd.DataFrame.fillna
的转置,使用NaN和df
调用替换0。
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
答案 1 :(得分:3)
使用where/mask
我们取消第一个参数为True
的位置,并用第二个参数中的替代填充它。
df.where(df.astype(bool), df.T)
或者,
df.mask(df.eq(0), df.T)
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
根据@cᴏʟᴅsᴘᴇᴇᴅ的建议,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
答案 2 :(得分:3)
您可以通过布尔
指定它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