read_csvを使用してタブ区切りのデータをパンダデータフレームに読み込んでいますが、列データ内にタブがあります。つまり、「\ t」を区切り文字として使用することはできません。具体的には、各行の最後のエントリは、[A-Za-z] [A-Za-z0-9]:[A-Za-z]:。+に一致するタブ区切りのオプションタグのセットです。+についての保証はありません。タグの数または存在するタグの数、およびタグの異なるセットが異なる行で発生する可能性があります。データの例は次のようになります(すべての空白は私のデータのタブです):
C42TMACXX:5:2316:15161:76101 163 1 @<@DFFADDDF:DD NH:i:1 HI:i:1 AS:i:200 nM:i:0
C42TMACXX:5:2316:15161:76101 83 1 CCCCCACDDDCB@B NH:i:1 HI:i:1 nM:i:1
C42TMACXX:5:1305:26011:74469 163 1 CCCFFFFFHHHHGJ NH:i:1 HI:i:1 AS:i:200 nM:i:0
タグを1つの列として読み込むことを提案していますが、タグのコンテキストで発生するタブを除外するセパレーターの正規表現を渡すことで、これを実行できると思いました。
http://www.rexegg.com/regex-best-trick.htmlに続いて、これについて次の正規表現を作成しました:[A-Za-z] [A-Za-z0-9]:[A-Za-z] :[^ \ t] + \ t ..:|(\ t)。オンラインの正規表現テスターでテストしましたが、セパレーターとして必要なタブとちょうど一致しているようです。
しかし、私が走るとき
df = pd.read_csv(myfile.txt, sep=r"[A-Za-z][A-Za-z0-9]:[A-Za-z]:[^\t]+\t..:|(\t)",
header=None, engine="python")
print(df)
このデータに対して次の出力が得られます。
0 1 2 3 4 5 6 7 8 \
0 C42TMACXX:5:2316:15161:76101 \t 163 \t 1 \t @<@DFFADDDF:DD \t NaN
1 C42TMACXX:5:2316:15161:76101 \t 83 \t 1 \t CCCCCACDDDCB@B \t NaN
2 C42TMACXX:5:1305:26011:74469 \t 163 \t 1 \t CCCFFFFFHHHHGJ \t NaN
9 10 11 12 13 14
0 NaN i:1 \t NaN NaN i:0
1 NaN i:1 \t nM:i:1 NaN None
2 NaN i:1 \t NaN NaN i:0
私が期待していた/欲しかったのは:
0 1 2 3 4
0 C42TMACXX:5:2316:15161:76101 163 1 @<@DFFADDDF:DD NH:i:1 HI:i:1 AS:i:200 nM:i:0
1 C42TMACXX:5:2316:15161:76101 83 1 CCCCCACDDDCB@B NH:i:1 HI:i:1 nM:i:1
2 C42TMACXX:5:1305:26011:74469 163 1 CCCFFFFFHHHHGJ NH:i:1 HI:i:1 AS:i:200 nM:i:0
どのようにそれを達成しますか?
関連する場合は、パンダ0.17.1を使用しており、実際のデータファイルは1億行以上です。
pandasのドキュメントをざっと見てみましたが、区切り文字として使用されている正規表現ではグループを使用できないようです。
C42TMACXX:5:2316:15161:76101 163 1 @<@DFFADDDF:DD NH:i:1 HI:i:1 AS:i:200 nM:i:0
C42TMACXX:5:2316:15161:76101 83 1 CCCCCACDDDCB@B NH:i:1 HI:i:1 nM:i:1
C42TMACXX:5:1305:26011:74469 163 1 CCCFFFFFHHHHGJ NH:i:1 HI:i:1 AS:i:200 nM:i:0
^ ^ ^ ^
最初の4つのタブのみを一致させる必要がありますが、グループを使用せずに一致させることはできません。
解決策は、\t
先読みと後読みを使用して必要なものを分離することです。
これが機能するはずの正規表現です:
(?<=\d)\t(?=\d)|\t(?=[A-Z@<:]{14})|(?<=[A-Z@<:]{14})\t
説明
(?<=\d)\t(?=\d)
:タブでは、precedeed(?<=...)
数字と続く(?=...)
数字
=> 1番目と2番目のタブに一致
|
または
\t(?=[A-Z@<:]{14})
:タブの後にセットLETTER、@、<または:に存在する14個の連続した文字が続く
=> 3番目のタブに一致
|
または
(?<=[A-Z@<:]{14})\t
:同じ14文字セットが前に付いたタブ
=> 4番目のタブに一致
注意
14個の連続する文字パターンでさらに多くの文字を許可する必要がある場合は、それらをセットに追加するだけです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加