Python 使用条件替换dataframe中从索引1开始的所有列

Python 使用条件替换dataframe中从索引1开始的所有列,python,pandas,dataframe,Python,Pandas,Dataframe,我想根据第一列替换dataframe中第一列之后的列。假设我们有: df = {'Z': ['1', '0', '1', '1', '0'], 'A': ['1', '1', '1', '0', '0'], 'B': ['0', '0', '1', '0', '0'], 'C': ['1', '0', '0', '0', '`1']} df = pd.DataFrame (df, columns = ['Z','A','B','C']) df

我想根据第一列替换dataframe中第一列之后的列。假设我们有:

df = {'Z':  ['1', '0', '1', '1', '0'],
        'A': ['1', '1', '1', '0', '0'],
        'B': ['0', '0', '1', '0', '0'],
        'C': ['1', '0', '0', '0', '`1']}

df = pd.DataFrame (df, columns = ['Z','A','B','C'])

df
如果column=Z,则我想用
1替换列,否则为0

预期结果如下:

df2 = {'Z':  ['1', '0', '1', '1', '0'],
        'A': ['1', '0', '1', '0', '1'],
        'B': ['0', '1', '1', '0', '1'],
        'C': ['1', '1', '0', '0', '`0']}

df2 = pd.DataFrame (df2, columns = ['Z','A','B','C'])

df2
z = df.iloc[:, 0].values
rest = df.iloc[:, 1:].values

df2 = pd.DataFrame(data=(z[:, None] == rest).astype(int), columns=df.columns[1:], index=df['Z']).reset_index()
print(df2)
问题是我有60列(A、B、C、D,…),我希望能够同时执行这些操作。

使用:

输出

   Z  A  B  C
0  1  1  0  1
1  0  0  1  1
2  1  1  1  0
3  1  0  0  0
4  0  1  1  0
   Z  A  B  C
0  1  1  0  1
1  0  0  1  1
2  1  1  1  0
3  1  0  0  0
4  0  1  1  0
如果需要新的数据帧,请执行以下操作:

df2 = {'Z':  ['1', '0', '1', '1', '0'],
        'A': ['1', '0', '1', '0', '1'],
        'B': ['0', '1', '1', '0', '1'],
        'C': ['1', '1', '0', '0', '`0']}

df2 = pd.DataFrame (df2, columns = ['Z','A','B','C'])

df2
z = df.iloc[:, 0].values
rest = df.iloc[:, 1:].values

df2 = pd.DataFrame(data=(z[:, None] == rest).astype(int), columns=df.columns[1:], index=df['Z']).reset_index()
print(df2)
输出

   Z  A  B  C
0  1  1  0  1
1  0  0  1  1
2  1  1  1  0
3  1  0  0  0
4  0  1  1  0
   Z  A  B  C
0  1  1  0  1
1  0  0  1  1
2  1  1  1  0
3  1  0  0  0
4  0  1  1  0
您可以使用沿
axis=0
将列
Z
与其余列进行比较,然后
join
将结果数据框与列
Z
mask
关联
NaN
值:

df[['Z']].join(df.drop('Z', 1).eq(df['Z'], axis=0).astype(int)).mask(df.isna())


我认为有一种简单的方法可以通过检查等式并转换为整数来实现

z = df["Z"]
others = [c for c in df.columns if c != "Z"] # all columns but 'Z'

df[others] = df[others].transform(lambda x : x.eq(z).astype(int))
产出:

   Z  A  B  C
0  1  1  0  1
1  0  0  1  1
2  1  1  1  0
3  1  0  0  0
4  0  1  1  0

请注意,有一种方法可以保持
NA
,但是您必须使用pandas数据类型,请参见和。

如果z=COLUMN ELSE 0,那么
1意味着什么?如果COLUMN=z,那么1 ELSE 0列是什么?如果COLUMN a=COLUMN z,那么1 ELSE 0列是什么?但是我需要它,因为我有60列。以上只是提供上下文所有栏目的编号?非常感谢@Dani Masejo!这正是我要找的!Majeso-假设A、B或C中的一些值包含Nan,我希望它们保持为Nan-我需要为此向代码中添加什么?@JoeSmart谁有Nan值z,或者其他列?z没有Nan。A、 B,C可能有一些问题。如果他们真的有NaN,我希望他们保持原样。上述方法用于将NaN转换为0@JoeSmart让他们回到nan身边