0

私はファイルenergy.txtを持っています:

path   energy      counter
AXX    100.00          1
AXX     99.99          2
AXX     99.98          1
AXX     99.50          1
AXX     99.00          7

2 番目の列の値を比較したいのですが、それらの差が 0.02 未満の場合は、2 番目の値を保持してカウンターを追加します。

たとえば、最初のステップは 100.00 - 99.99 = 0.01 (0.02 未満) になるため、

path   energy      counter
AXX     99.99          3   
AXX     99.98          1
AXX     99.50          1
AXX     99.00          7 

2 番目: 99.99 - 99.98 = 0.01 なので、

path   energy      counter
AXX     99.98          4
AXX     99.50          1
AXX     99.00          7 

3 番目: 99.98 - 99.50 = 0.48 (0.02 より大きい)

4 番目: 99.50 - 99.00 = 0.50 (0.02 より大きい)。

これをPythonでやりたいです。

4

2 に答える 2

1

パンダスタイル:

import pandas as pd

df = pd.read_table(filename, sep='\s+')

# generate a value (label) with which we can group rows together
label = (df['energy'].diff() < -0.02).astype('int')
df['label'] = label.cumsum()
print(df)
#   path  energy  counter  label
# 0  AXX  100.00        1      0
# 1  AXX   99.99        2      0
# 2  AXX   99.98        1      0
# 3  AXX   99.50        1      1
# 4  AXX   99.00        7      2

# Aggregate the count for each label group
grouped = df.groupby(['label'])
counts = grouped[['counter']].agg('sum')
print(counts)
#        counter
# label         
# 0            4
# 1            1
# 2            7

# Find the index of the row with the minimum energy per group
idx = grouped['energy'].agg(lambda col: col.idxmin())

# Select only those rows from df
result = df.ix[idx, ['path', 'energy', 'label']]

# Merge in the computed counts
result = pd.merge(result, counts, left_on=['label'], right_index=True)
result = result.ix[:, ['path','energy','counter']]
print(result)

収量

  path  energy  counter
2  AXX   99.98        4
3  AXX   99.50        1
4  AXX   99.00        7
于 2013-04-27T19:25:35.583 に答える
0

辞書を使用すると、次のようになります。

with open("abc") as f:
    next(f)
    dic={}
    counter=1
    dic[counter]=map(float,next(f).split()[1:])
    for line in f:
        curr=map(float,line.split()[1:])
        if abs(dic[counter][0]-curr[0])<0.02:
            dic[counter]=[curr[0], dic[counter][1]+curr[1]]
        else:
            counter+=1
            dic[counter]=curr

for key in sorted(dic):
    print dic[key]

出力:

[99.98, 4.0]
[99.5, 1.0]
[99.0, 7.0]
于 2013-04-27T18:47:56.693 に答える