根据列之一中的值类型交换列中的值

时间:2019-10-24 14:10:39

标签: python pandas dataframe

假设我有以下熊猫数据框:

df = pd.DataFrame([['A','B'],[8,'s'],[5,'w'],['e',1],['n',3]])
print(df)

   0  1
0  A  B
1  8  s
2  5  w
3  e  1
4  n  3

如果第1列中有一个整数,那么我想将值与第0列中的值交换,换句话说,我要生成此数据帧:

   0  1
0  A  B
1  8  s
2  5  w
3  1  e
4  3  n

2 个答案:

答案 0 :(得分:4)

to_numericerrors='coerce'Series.notna替换带有掩码的第二列中的数字:

m = pd.to_numeric(df[1], errors='coerce').notna()

另一种通过Series.astypeSeries.str.isnumeric转换为字符串的解决方案-但仅适用于整数:

m = df[1].astype(str).str.isnumeric()

然后用numpy数组的DataFrame.loc替换为DataFrame.values,以避免列对齐:

df.loc[m, [0, 1]] = df.loc[m, [1, 0]].values
print(df)
   0  1
0  A  B
1  8  s
2  5  w
3  1  e
4  3  n

最后(如果可能更好的话)是将第一行转换为列名:

df.columns = df.iloc[0]
df = df.iloc[1:].rename_axis(None, axis=1)
print(df)
   A  B
1  8  s
2  5  w
3  1  e
4  3  n

或可能删除header=None中的read_csv

答案 1 :(得分:2)

sorted

带有测试int

的密钥
df.loc[:] = [
    sorted(t, key=lambda x: not isinstance(x, int))
    for t in zip(*map(df.get, df))
]

df

   0  1
0  A  B
1  8  s
2  5  w
3  1  e
4  3  n

如果愿意,您可以在列中明确显示

df[[0, 1]] = [
    sorted(t, key=lambda x: not isinstance(x, int))
    for t in zip(df[0], df[1])
]