移动不完整的Pandas DataFrame行以使用部分字符串搜索来清理数据

时间:2014-04-09 22:24:43

标签: python pandas concat

从.csv文件导入数据后,我有一些与此类似的数据(尽管订购了数百列和数千行):

         4        5        6      7       8       9        10     11    12      13         14         15   16
0   302255Z  09005KT        1  1/4SM      BR     CLR  M00/M00  A3044   RMK    AO2A     SLP311  T10021002   $;
1   302232Z  08003KT        1    1/4      BR     CLR  M00/M00  A3044   RMK    AO2A     SLP310         $;  NaN
2   302225Z  09005KT        1  1/2SM      BR     CLR  M00/M00  A3044   RMK    AO2A     SLP309         $;  NaN
3   302155Z  08003KT        2  1/2SM      BR     CLR  M00/M00  A3043   RMK    AO2A     SLP306  T10001000   $;
4   302055Z  09004KT      3SM     BR     CLR   00/00    A3042    RMK  AO2A  SLP304  T00020002      56001   $;
5   301955Z  00000KT      3SM     BR     CLR   01/01    A3042    RMK  AO2A  SLP304  T00080008         $;  NaN
6   301855Z  09006KT      3SM     BR  FEW055   01/01    A3042    RMK  AO2A  SLP303  T00110011         $;  NaN
7   301655Z  10004KT        2  1/2SM      BR  FEW050  M00/M00  A3041   RMK    AO2A     SLP301  T10031003   $;
8   301610Z  09004KT        2  1/2SM      BR     CLR    00/00  A3041   RMK    AO2A     SLP301         $;  NaN
9   301555Z     AUTO  08005KT   4800      BR     CLR    01/01  A3041   RMK     AO2     SLP300  T00070007   $;
10  301509Z     AUTO  06003KT   4800      BR     CLR    01/01  A3041   RMK     AO2     SLP300         $;  NaN
11  301449Z     AUTO  10003KT   4000      BR     CLR    01/01  A3041   RMK     AO2     SLP300         $;  NaN
12  301355Z     AUTO  07004KT   6000      BR     CLR    02/02  A3041   RMK     AO2     SLP300  T00230023   $;
13  301255Z     AUTO  07003KT   6000      BR     CLR    02/02  A3041   RMK     AO2     SLP299  T00200020   $;
14  301055Z     AUTO  00000KT   9000      BR     CLR    04/04  A3040   RMK     AO2     SLP298  T00360036   $;

我放弃了尝试将所有东西都转移到正确的位置。相反,我正在尝试创建一个新列,它将第5列和第6列的条目组合在一起,以KT结尾的值。我正在为从T开始的那些值创建第二个新列。

首先,我尝试在第5行和第6行中提取符合我标准的所有数据,如下所示:

df1=df[df[5].str.contains("KT")].iloc[:,[0,5]]
df2=df[df[6].str.contains("KT")].iloc[:,[0,6]]

.iloc值是尝试将结果合并在一起。必须有一种更流畅的方式来格式化。有什么想法吗?

如果有帮助,这里有一个更简单的数据集:

row1=['a','b','c1K','d','e','foo','foo','f1111T','g','$']
row2=['a','b','foo','c2K','d','e','f4321T','g','$','$']
row3=['a','b','c3K','d','e','f1234T','g','$']
df=ps.DataFrame(zip(row1,row2,row3)).T
df1=df[df[2].str.contains("K")].iloc[:,[0,2]]
df2=df[df[3].str.contains("K")].iloc[:,[0,3]]

尝试ps.concat([df1,df2],axis = 0,join ='outer')并没有给出我想要的东西,它给出了

   0    2    3
0  a  c1K  NaN
2  a  c3K  NaN
1  a  NaN  c2K

这样的事情会更漂亮:

      0   
1  a  c1K  
2  a  c3K 
3  a  c2K

1 个答案:

答案 0 :(得分:1)

以下可以一次完成(使用loc作为iloc并不允许布尔屏蔽):

df1 = df[df[5].str.contains("KT")].iloc[:,[0,5]]

df1 = df.loc[df[5].str.contains("KT"), [0, 5]]

要获得最终结果,您可以将它们连接成一个系列(以避免对齐列),或者在连接之前更改列的名称以使其更具描述性:

df1.columns = ['letter', 'code']
df2.columns = ['letter', 'code']
pd.concat([df1, df2], axis=0, ignore_index=True)