2017-07-09 4 views
0

私はpython pandasの新機能です。 私は10k +行のソートされたpandasデータフレームを持っています。ここ は、サンプルデータフレームである:複数の列に同じ値を持ち、別の列にあるデータを比較する、パンダのデータフレームの2つの行を結合する

例:

   0   1     2  3  4    5 

Hour:12 Min:31 Sec:24 Ms E_ID:459 Name:I_SECONDROW UE_C:10 M_ID:93 C_ID_1:20337  
Hour:12 Min:32 Sec:33 Ms E_ID:459 Name:M_FIRSTROWW UE_C:10 M_ID:93 C_ID_1:20337  
Hour:12 Min:30 Sec:31 Ms E_ID:459 Name:M_FIRSTROWW UE_C:10 M_ID:93 C_ID_1:20337  
Hour:12 Min:32 Sec:33 Ms E_ID:459 Name:M_FIRSTROWW UE_C:10 M_ID:93 C_ID_1:20337   
Hour:12 Min:31 Sec:19 Ms E_ID:459 Name:I_SECONDROW UE_C:10 M_ID:93 C_ID_1:20337  
Hour:12 Min:32 Sec:22 Ms E_ID:459 Name:M_FIRSTROWW UE_C:10 M_ID:93 C_ID_1:20337  
Hour:12 Min:30 Sec:26 Ms E_ID:459 Name:I_SECONDROW UE_C:10 M_ID:93 C_ID_1:20337  
Hour:12 Min:30 Sec:26 Ms E_ID:459 Name:I_SECONDROW UE_C:10 M_ID:93 C_ID_1:20337   
Hour:12 Min:30 Sec:26 Ms E_ID:459 Name:I_SECONDROW UE_C:10 M_ID:93 C_ID_1:20337   
Hour:12 Min:32 Sec:17 Ms E_ID:459 Name:I_SECONDROW UE_C:10 M_ID:93 C_ID_1:20337   
Hour:12 Min:30 Sec:24 Ms E_ID:459 Name:I_SECONDROW UE_C:10 M_ID:93 C_ID_1:20337    
Hour:12 Min:32 Sec:46 Ms E_ID:459 Name:I_SECONDROW UE_C:9 M_ID:93 C_ID_1:20337   
Hour:12 Min:30 Sec:24 Ms E_ID:500 Name:I_SECONDROW UE_C:1 M_ID:80 C_ID_1:20110   
Hour:12 Min:30 Sec:26 Ms E_ID:500 Name:M_FIRSTROWW UE_C:1 M_ID:80 C_ID_1:20110  

今はM_FIRSTROWW & I_SECONDROWとしてNAMEと2行(ペア)を結合すると、カラム1、3、4で同じデータを持ちます、5

選択したペアは、5秒以下の時間差を持つ必要があります。

期待出力:

Hour:12 Min:30 Sec:24 Ms E_ID:500 Name:I_SECONDROW UE_C:1 M_ID:80 C_ID_1:20110   
Hour:12 Min:30 Sec:26 Ms E_ID:500 Name:M_FIRSTROWW UE_C:1 M_ID:80 C_ID_1:20110 


Hour:12 Min:30 Sec:31 Ms E_ID:459 Name:M_FIRSTROWW UE_C:10 M_ID:93 C_ID_1:20337 
Hour:12 Min:30 Sec:26 Ms E_ID:459 Name:I_SECONDROW UE_C:10 M_ID:93 C_ID_1:20337 


Hour:12 Min:32 Sec:22 Ms E_ID:459 Name:M_FIRSTROWW UE_C:10 M_ID:93 C_ID_1:20337 
Hour:12 Min:32 Sec:17 Ms E_ID:459 Name:I_SECONDROW UE_C:10 M_ID:93 C_ID_1:20337 
+0

私は同様の質問に答えました。そこを見てください:https://stackoverflow.com/questions/44998223/list-of-all-duplicate-columns-in-pandas/44998316#44998316 – cgte

答えて

0

1)いくつかの有用な輸入

import pandas as pd 
import numpy as np 
import datetime as dt 
import itertools 
import re 

2)インポートおよびクリーンデータ

df = pd.read_csv("data.csv", sep="|", header=None, names=["time", "mseid", "name", "uec", "mid", "cid"]) 
df["time"] = [dt.datetime.strptime(":".join(re.findall(r'\d+', time_string)), "%H:%M:%S") for time_string in df["time"]] 
df["mseid"] = [mseid.split(":")[-1] for mseid in df["mseid"]] 
df["name"] = [name.split(":")[-1] for name in df["name"]] 
df["uec"] = [uec.split(":")[-1] for uec in df["uec"]] 
df["mid"] = [mid.split(":")[-1] for mid in df["mid"]] 
df["cid"] = [cid.split(":")[-1] for cid in df["cid"]] 

3)時間と行名によってソートリスト、行名でグループ化し、これらのグループの索引を抽出します。私たちは、その後、ペアリングするこれらのインデックスを圧縮することができますFIRSTROWSECONDROW

df_sorted = df.sort_values(["name", "time"]).groupby("name").groups.values() 
>>> dict_values([Int64Index([10, 12, 6, 7, 8, 4, 0, 9, 11], dtype='int64'), Int64Index([13, 2, 5, 1, 3], dtype='int64')]) 

# https://stackoverflow.com/questions/12355442/converting-a-list-of-tuples-into-a-simple-flat-list 
ordered = list(itertools.chain(*zip(*df_sorted))) 
num_groups = int(len(ordered)/2) 
ordered += [ind for ind in df.index if ind not in ordered] 
ordered 
>>> [10, 13, 12, 2, 6, 5, 7, 1, 8, 3, 0, 4, 9, 11] 


df = df.iloc[ordered] 
df = df.reset_index() 
del df['index'] 
df.head() 

>>>  time mseid name uec mid cid 
0 1900-01-01 12:30:24 459 I_SECONDROW 10 93 20337 
1 1900-01-01 12:30:26 500 M_FIRSTROWW 1 80 20110 
2 1900-01-01 12:30:24 500 I_SECONDROW 1 80 20110 
3 1900-01-01 12:30:31 459 M_FIRSTROWW 10 93 20337 
4 1900-01-01 12:30:26 459 I_SECONDROW 10 93 203377 

4)を作成し、行ペアリングのために

groups = [val for val in range(num_groups) for _ in [0, 1]] 
remainder = len(df.index) - len(groups) 
groups = groups + ["-" for i in range(remainder)] 
df["pair"] = groups 
groups 

>>> [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, '-', '-', '-', '-'] 

5)グループの行のペアを列を追加し、時間差を見つけて、TIME_DELTAために列を追加

pairs = df.groupby("pair")["time"] 
time_delta = [] 
for pair in pairs: 
    if len(pair[1]) == 2: 
     second, first = pair[1].values 
     time_difference = abs(int((first - second)/1000000000)) # nanoseconds to seconds 
     time_delta.append(time_difference) 
time_delta = [val for val in time_delta for _ in [0, 1]] 
remainder = len(df.index) - len(time_delta) 
time_delta = time_delta + [np.NaN for i in range(remainder)] 
df["time_delta"] = time_delta 
df 

>>>  time mseid name uec mid cid pair time_delta 
0 1900-01-01 12:30:24 459 I_SECONDROW 10 93 20337 0 2.0 
1 1900-01-01 12:30:26 500 M_FIRSTROWW 1 80 20110 0 2.0 
2 1900-01-01 12:30:24 500 I_SECONDROW 1 80 20110 1 7.0 
3 1900-01-01 12:30:31 459 M_FIRSTROWW 10 93 20337 1 7.0 
4 1900-01-01 12:30:26 459 I_SECONDROW 10 93 20337 2 116.0 

6)最後に、次いで、全てtime_delta S < = 5を取得するをブールマスクを作成します3210

df[df.time_delta <=5].head().groupby("pair").head() 

    time mseid name uec mid cid pair time_delta 
0 1900-01-01 12:30:24 459 I_SECONDROW 10 93 20337 0 2.0 
1 1900-01-01 12:30:26 500 M_FIRSTROWW 1 80 20110 0 2.0 

注意timestampのデフォルトは1900年です。これは、同じ日の時刻を差し引くためではありません。ただし、データを作成するときは、正確なタイムスタンプを使用する必要があります。

+0

ありがとうDermot McGrath .. !! – user3484464

+0

ペアを作成するときは、FIRSTROWとSECONDROWがmseid、mid、cidに同じ値を持つように、妥当性検査を行う必要があります。 – user3484464

+0

すなわち、それらがmesid、mid、cidに同じ値を持つように、FIRSTROWとSECONDROWの行ペアを作成します。 – user3484464

関連する問題