如何根据python中其他列的单元格条件来移动列的位置



我需要一些关于python的帮助。以下是我想要实现的目标。

我有一个数据集,如下所示:

import pandas as pd

# define data
data = {'A': [55, "g", 35, 10,'pj'], 'B': [454, 27, 895, 3545,34], 
'C': [4, 786, 7, 3, 896], 
'Phone Number': [123456789, 7, 3456789012, 4567890123, 1],'another_col':[None,234567890,None,None,215478565]}
pd.DataFrame(data)
A   B       C   Phone Number    another_col
0   55  454     4   123456789          None
1   g   27     786  7               234567890.0
2   35  895     7   3456789012         None
3   10  3545    3   4567890123         None
4   pj  34     896  1               215478565.0

我已经从pdf中提取了这些数据,不幸的是,它在数据帧中添加了一些随机字符串,如上所示。我想检查任何列中的任何单元格是否包含字符串或没有数值。如果是,则删除该字符串并将整行向左移动。最后,所需的输出如下所示:

A   B      C    Phone Number     another_col
0   55  454    4    1.234568e+08        None
1   27  786    7    2.345679e+08        None
2   35  895    7    3.456789e+09        None
3   10  3545   3    4.567890e+09        None
4   34  896    1    2.15478565+8        None

我真的很感谢你的帮助。

一种方法是使用to_numeric将每个值强制转换为数值,然后使用dropna:向左移动每一行

out = (df.apply(pd.to_numeric, errors='coerce')
.apply(lambda x: pd.Series(x.dropna().tolist(), index=df.columns.drop('another_col')), axis=1))

输出:

A       B    C  Phone Number
0  55.0   454.0  4.0  1.234568e+08
1  27.0   786.0  7.0  2.345679e+08
2  35.0   895.0  7.0  3.456789e+09
3  10.0  3545.0  3.0  4.567890e+09
4  34.0   896.0  1.0  2.154786e+08

您可以创建布尔掩码shiftpd.concat:

m=pd.to_numeric(df['A'], errors='coerce').isna()
pd.concat([df.loc[~m], df.loc[m].shift(-1, axis=1)]).sort_index()

输出:

A     B  C  Phone Number  another_col
0  55   454  4  1.234568e+08          NaN
1  27   786  7  2.345679e+08          NaN
2  35   895  7  3.456789e+09          NaN
3  10  3545  3  4.567890e+09          NaN
4  34   896  1  2.154786e+08          NaN

最新更新