8

次のようなdate_time / voltageデータを持つパンダDataFrameがあります(df1):

        Date_Time  Chan
0   20130401 9:00   AAT
1  20130401 10:00   AAT
2  20130401 11:00   AAT
3  20130401 12:00   AAT
4  20130401 13:00   AAT
5  20130401 14:00   AAT
6  20130401 15:00   AAT

これをプロトタイプとして使用して、はるかに大きなデータ ファイルからデータを読み込み、1 つの DataFrame を作成しています。他の DataFrame は次のようになります (df2):

Chan          date_time  Sens1  Sens2 
 AAC  01-Apr-2013 09:00   5.17   1281
 AAC  01-Apr-2013 10:00   5.01    500
 AAC  01-Apr-2013 12:00   5.17    100
 AAC  01-Apr-2013 13:00   5.19  41997
 AAC  01-Apr-2013 16:00   5.21   2123
 AAT  01-Apr-2013 09:00  28.82    300
 AAT  01-Apr-2013 10:00  28.35   4900
 AAT  01-Apr-2013 12:00  28.04    250
 AAE  01-Apr-2013 11:00   3.36    400
 AAE  01-Apr-2013 12:00   3.41    200
 AAE  01-Apr-2013 13:00   3.40   2388
 AAE  01-Apr-2013 14:00   3.37    300
 AAE  01-Apr-2013 15:00   3.35    500
 AXN  01-Apr-2013 09:00  23.96   6643
 AXN  01-Apr-2013 10:00  24.03   1000
 AXW  01-Apr-2013 11:00  46.44   2343

したがって、df1 の両方の列から一致するすべてのインスタンスを df2 で検索し (データ形式が異なることに注意してください)、df2 のデータを df1 に挿入します。このように (df1)

         Date_Time  Chan  Sens1  Sens2 
 0   20130401 9:00   AAT  28.82    300
 1  20130401 10:00   AAT  28.35   4900
 2  20130401 11:00   AAT    NaN    NaN
 3  20130401 12:00   AAT  28.04    250
 4  20130401 13:00   AAT    NaN    NaN
 5  20130401 14:00   AAT    NaN    NaN
 6  20130401 15:00   AAT    NaN    NaN

この疑似コードに一致する python/pandas コードの提案をいくつか教えてください。

if (df1['date_time'] = df2['date_time']) & (df1['Chan'] = df2['Chan'])): 
    df1['Sens1'] = df2['Sens1']
    df1['Sens2'] = df2['Sens2']

それが答えに影響する場合は、NaN を bfill および ffill してから、この DataFrame を Panel に追加し、AAT の代わりに別のチャネル名で繰り返すことを意図しています。

4

1 に答える 1

9

これを行うには、普通のマージを使用できます。ただし、最初に、DataFrame を少しクリーンアップして、datetime 列が文字列ではなく実際に日時であることを確認する必要があります (注: csv などとして読み取る場合は、これを行う方がよい場合があります)。

df1['Date_Time'] = pd.to_datetime(df1['Date_Time'], format='%Y%m%d %H:%M')
df2['date_time'] = pd.to_datetime(df2['date_time'])

Datetime 列の名前も同じ名前に変更しましょう。

df1.rename(columns={'Date_Time': 'Datetime'}, inplace=True)
df2.rename(columns={'date_time': 'Datetime'}, inplace=True)

これで、単純なマージにより、目的が得られます。

In [11]: df1.merge(df2)
Out[11]: 
             Datetime Chan  Sens1  Sens2
0 2013-04-01 09:00:00  AAT  28.82    300
1 2013-04-01 10:00:00  AAT  28.35   4900
2 2013-04-01 12:00:00  AAT  28.04    250

In [12]: df1.merge(df2, how='left')
Out[12]: 
             Datetime Chan  Sens1  Sens2
0 2013-04-01 09:00:00  AAT  28.82    300
1 2013-04-01 10:00:00  AAT  28.35   4900
2 2013-04-01 11:00:00  AAT    NaN    NaN
3 2013-04-01 12:00:00  AAT  28.04    250
4 2013-04-01 13:00:00  AAT    NaN    NaN
5 2013-04-01 14:00:00  AAT    NaN    NaN
6 2013-04-01 15:00:00  AAT    NaN    NaN
于 2013-09-26T01:21:07.607 に答える