通过将索引设置为序列的列来使用pd.concat

时间:2019-11-17 17:46:09

标签: python regex pandas dataframe

简而言之,我正在尝试通过使用正则表达式作为索引从各种表中编译数据来生成新表。我以前的脚本(可以在这里Formatting issues using Regex and Pandas中进行)完全做到了这一点,但是,正如您在帖子中所看到的那样,由于正则表达式使用字符串,因此存在一个问题,但是pandas似乎存在一些问题。答案中的某个人发布了使用序列的更为简洁的方法,因此我一直在尝试实现这一点。我已经对其进行了一些修改以获得所需的输出,这是我当前的脚本:

mport re
import os
import pandas as pd
import numpy

os.chdir('C:/Users/Sams PC/Desktop')
f=open('test5.txt', 'w')

NHSQC=pd.read_csv('NHSQC.txt', sep='\s+', header=None)
NHSQC.columns=['Column_1','Column_2','Column_3']
HNCA=pd.read_csv('HNCA.txt', sep='\s+', header=None)
HNCA.columns=['Column_1','Column_2','Column_3','Column_4']
df1 = NHSQC.loc[NHSQC["Column_1"].str.match(re.compile("[A-Z][0-9][0-9][A-Z]-HN"))]
df2 = HNCA.loc[HNCA["Column_1"].str.match(re.compile("[A-Z][0-9][0-9][A-Z]-CA-HN")), ["Column_3"]]
#df3 = HNCACB.loc[HNCACB["Column_1"].str.match(re.compile("[A-Z][0-9][0-9][A-Z]-CB-HN")), ["Column_1", "Column_3"]]
long1=pd.concat([df1],ignore_index=True)
long2=pd.concat([df2],ignore_index=True)
long3=pd.concat([long1,long2],axis=1).stack()
print (long3)
a=long3.to_numpy()
print(a)
numpy.savetxt('data.txt',a, fmt='%5s')

这是我的数据表的样子。

Data Tables
   Column_1  Column_2  Column_3
0   S31N-HN   114.424     7.390
1   Y32N-HN   121.981     7.468
2   Q33N-HN   120.740     8.578
3   A34N-HN   118.317     7.561
4   G35N-HN   106.764     7.870
5   R36N-HN   117.833     8.108
6   G37N-HN   110.365     8.483
7   I55N-HN   118.190     7.933
8   Y56N-HN   123.023     8.079
9   A57N-HN   120.470     7.980
10  S72N-HN   117.259     8.360
11  C73N-HN   128.142     9.678
12  G74N-HN   116.187     9.433
13  H75N-HN   122.640     9.643
14  C76N-HN   122.738     7.146
15  R77N-HN   120.143     8.732
16  G78N-HN   106.337     7.943
17  C79N-HN   125.089     9.172
18  Q80N-HN   119.163     8.711
19  L81N-HN   119.702     8.382
20  A84N-HN   118.920     7.495
21  G85N-HN   107.678     7.893
22  T86N-HN   108.793     8.203
23  H87N-HN   129.219     9.208
24  D89N-HN   121.596    10.626
25  Y90N-HN   119.615     6.855
26  Y91N-HN   127.756     9.139
27  T92N-HN   114.719     8.330
28  L93N-HN   127.305     9.106
29  A94N-HN   128.191     8.221
30  E96N-HN   122.914     8.617
31  K97N-HN   122.785     8.536
32  G98N-HN   113.339     8.847
33  K99N-HN   119.895     8.177
   Column_3
3    61.717
6    60.789
8    58.706
10   52.260
12   46.507
14   54.858
16   44.901
17   65.360
19   62.195
21   55.522
23   58.583
25   61.410
27   46.528
29   56.784
31   57.527
33   59.674
35   47.214
37   65.321
39   59.562
41   57.634
42   52.695
44   45.872
46   59.954
48   53.088
50   53.811
52   55.543
54   57.106
56   60.419
58   53.801
60   49.596
61   56.221
63   58.398
65   45.722
67   55.322
Long3
0   Column_1    S31N-HN
    Column_2    114.424
    Column_3       7.39
    Column_3     61.717
1   Column_1    Y32N-HN
                 ...
32  Column_3     45.722
33  Column_1    K99N-HN
    Column_2    119.895
    Column_3      8.177
    Column_3     55.322

要以我想要的格式组合系列(再次,就像我之前的循环一样,将第一行中的所有值[例如S31N]并堆叠起来),我消除了先前的索引(因为在原始文本文件,它们没有相同的行数,这可以通过df1和df2的索引看到,但是在df1和df2中,它们现在确实具有相同的行数),并将它们堆叠在一起。当每个“索引”(例如S31N)在我的原始txt文件中都有一个值时,这确实很好用,因为这意味着结果系列将具有相同的行数。但是,在我将要使用的所有文件中不是这种情况,在这些文件中的某些文件中,S31N没有值。我知道如果您使用原始文件的原始索引(即ignore_index = False),那么它只会简单地说Nan,这不会成为问题。但是,在我的原始文件中,它们的行数都不相同,因此,一个文件中S31N的值可能是第一个索引,但是S31N的值可能是第4或第5行(即,我不会能够使用我以前的方法来尝试解决此问题,因此这篇文章)。

如果这太长且令人困惑,我深表歉意,我只想确切说明我所做的事情以及我现在的位置。对我来说,最简单的解决方案是使用Column_1作为索引,并根据该索引进行concat(例如,concat S31N的所有值)。但是,根据我已经阅读并尝试过的内容,索引可能是True(使用原始txt文件作为排序),或者是False(摆脱了原始txt文件的排序),但我一直无法找到一种方法更改索引以使用其他值或字符串连接文件。

作为参考,这些是我的原始txt文件。

      Column_1  Column_2  Column_3
0      S31N-HN   114.424     7.390
1      Y32N-HN   121.981     7.468
2      Q33N-HN   120.740     8.578
3      A34N-HN   118.317     7.561
4      G35N-HN   106.764     7.870
..         ...       ...       ...
89    R170N-HN   118.078     7.992
90    S171N-HN   110.960     7.930
91    R172N-HN   119.112     7.268
92   999_XN-HN   116.703     8.096
93  1000_XN-HN   117.530     8.040

[94 rows x 3 columns]
                Column_1 Column_2 Column_3 Column_4
0             Assignment       w1       w2       w3
1       S31N-A30CA-S31HN  114.424   54.808    7.393
2       S31N-A30CA-S31HN  126.854   53.005    9.277
3             S31N-CA-HN  114.424   61.717    7.391
4             S31N-HA-HN  126.864   59.633    9.287
..                   ...      ...      ...      ...
173          R170N-CA-HN  118.016   60.302    7.999
174  S171N-R170CA-S171HN  110.960   60.239    7.932
175          S171N-CA-HN  110.960   60.946    7.931
176  R172N-S171CA-R172HN  119.112   60.895    7.264
177          R172N-CA-HN  119.112   55.093    7.265

[178 rows x 4 columns]
                Column_1 Column_2 Column_3 Column_4
0             Assignment       w1       w2       w3
1             S31N-CA-HN  114.424   61.646    7.392
2             S31N-HA-HN  126.864   59.627    9.287
3             Y32N-CA-HN  121.981   60.890    7.469
4             Q33N-CA-HN  120.770   58.565    8.585
..                   ...      ...      ...      ...
243  S171N-R170CA-S171HN  110.960   59.873    7.935
244          S171N-CA-HN  110.977   60.730    7.933
245          S171N-CB-HN  110.960   63.317    7.930
246          R172N-CA-HN  119.112   54.990    7.254
247          R172N-CB-HN  119.112   31.158    7.269

[248 rows x 4 columns]

在这里您可以看到我在上面讨论的内容。我的第一个表中的S31N是索引0,而第二个表中的S31N是索引3。但是,由于两者都有值,因此在创建df1和df2时,如果忽略原始索引(ignore_index = True),则df1中的S31N和df2现在的索引为0。但是,对于没有值的情况,例如我的第3个表(在原始脚本中为#)。这意味着对于Y32N,两个txt文件中都再次有数据,因此如果忽略了原始索引,则df1和df2将为索引1,但在数据表3中它将为索引0(因为在df1中,从不能够找到S31N-CB-HN)。因此,我认为最简单的思考方法是使用Column_1(它将是实际的S31N或Y32N字符串)作为索引。

对于造成混淆的情况,我深表歉意。如果有任何需要澄清或不清楚的地方(或者您有任何建议更简洁地解释我的意图),请告诉我。谢谢!

0 个答案:

没有答案