假设我有以下熊猫数据框:
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
答案 0 :(得分:4)
用to_numeric
用errors='coerce'
和Series.notna
替换带有掩码的第二列中的数字:
m = pd.to_numeric(df[1], errors='coerce').notna()
另一种通过Series.astype
和Series.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])
]