2

私は大規模なデータセットを持っており (以下のフォーマット例を参照)、次のことを行う必要があります:

  1. 列1、2、5に表示される繰り返し値を識別します-すべてが繰り返される場合、冗長な行を削除し、列8の値を平均する必要があります(これは、投稿するコードで成功します-
  2. ステップ 1 の後、列 1、2 の値を整数 (小数点なし) に丸めたい
  3. 列 3、4、6、および 7 を再導入したい -
    列 3、6、および 7 には、指定する特定の値が必要です (たとえば、3 はすべて 0、6 はすべて 1、列 7 はすべて 1 にする必要があります) (同様に入力ファイル) 列 4 の異なる値の数に基づいて、列 4 を 1 ずつ増やす必要があります) (入力ファイルと同様)

サンプルの入力ファイルは次のとおりです: data (ファイルの名前)

564991.15   7371277.89  0   1   1530    1   1   16.0225
564991.15   7371277.89  0   1   8250    1   1   14.4405
564991.15   7371277.89  0   2   1530    1   1   14.8637
564991.15   7371277.89  0   2   8250    1   1   14.8918
564991.17   7371277.89  0   3   1530    1   1   16.0002
564991.17   7371277.89  0   3   8250    1   1   15.4333
564991.04   7371276.76  0   4   1530    1   1   14.73
564991.04   7371276.76  0   4   8250    1   1   15.6138
564991.04   7371276.76  0   5   1530    1   1   16.2453
564991.04   7371276.76  0   5   8250    1   1   15.6138

そして、これが私が知っているコードです(現在、私はcalcで補足しています)

import os
import numpy as np
import pandas as pd
datadirectory = '/media/data'
os.chdir = 'datadirectory'
df = pd.read_csv('/media/data/data.dat')
sorted_data = df.groupby(["X.1","X.2","X.5"])["X.8"].mean().reset_index()
tuple_data = [tuple(x) for x in sorted_data.values]
datas = np.asarray(tuple_data)
np.savetxt('sorted_data_rounded.dat', datas, fmt='%s', delimiter='\t')

しかし、彼は私に4列しか与えず、丸められたデータは与えません....

4

3 に答える 3

2

半分を追加してキャストする方が少し速いかもしれません:astype int

df = pd.read_csv('data.dat', header=None, sep='\s+')

In [2]: df
Out[2]: 
           0           1  2  3     4  5  6        7
0  564991.15  7371277.89  0  1  1530  1  1  16.0225
1  564991.15  7371277.89  0  1  8250  1  1  14.4405
2  564991.15  7371277.89  0  2  1530  1  1  14.8637
3  564991.15  7371277.89  0  2  8250  1  1  14.8918
4  564991.17  7371277.89  0  3  1530  1  1  16.0002
5  564991.17  7371277.89  0  3  8250  1  1  15.4333
6  564991.04  7371276.76  0  4  1530  1  1  14.7300
7  564991.04  7371276.76  0  4  8250  1  1  15.6138
8  564991.04  7371276.76  0  5  1530  1  1  16.2453
9  564991.04  7371276.76  0  5  8250  1  1  15.6138

df1 = df.groupby([0, 1, 4])[7].mean().reset_index()
df1['ints'] = (df1[7] + 0.5).astype(int)

In [5]: df1
Out[5]: 
           0           1     4         7  ints
0  564991.04  7371276.76  1530  15.48765    15
1  564991.04  7371276.76  8250  15.61380    16
2  564991.15  7371277.89  1530  15.44310    15
3  564991.15  7371277.89  8250  14.66615    15
4  564991.17  7371277.89  1530  16.00020    16
5  564991.17  7371277.89  8250  15.43330    15

注:DataFrameメソッドを使用してDataFrameを保存できますto_csv

于 2013-01-10T23:28:33.763 に答える
1

ラウンド関数()を使用する

x = round(number to round , number of decimal places to round the number to )
于 2013-01-10T23:06:24.127 に答える
0

このコードは、私が望むことを正確に実行します。

import os
import numpy as np
import pandas as pd 

datadirectory = '/media/DATA'
os.chdir( datadirectory)

df = pd.read_csv('/media/DATA/data.dat', sep="\\s+", header=None)
df1 = df.groupby(["X.1","X.2","X.5"])["X.8"].mean().reset_index() 
df1['X.3'] = df["X.3"]
df1['X.4']=df["X.4"]
df1['X.6']=df["X.6"]
df1['X.7']=df["X.7"]
sorted_data = df1.reindex_axis(sorted(df1.columns), axis=1)
tuple_data = [tuple(x) for x in sorted_data.values]
datas = np.asarray(tuple_data)

dfround = df
dfround['X.1'] = df["X.1"].astype(int)
dfround['X.2'] = df["X.2"].astype(int)
df2 = dfround.groupby(["X.1","X.2","X.5"])["X.8"].mean().reset_index()
df2['X.3'] = df["X.3"] #add extra columns
df2['X.4']=df["X.4"]
df2['X.6']=df["X.6"]
df2['X.7']=df["X.7"]
sorted_data2 = df2.sort_index(axis=1) #rearragne data - method 2
tuple_data2 = [tuple(x) for x in sorted_data2.values]
datas2 = np.asarray(tuple_data2)

np.savetxt('sorted_data.dat', datas, fmt='%s', delimiter='\t') #Save the data
np.savetxt('sorted_rounded_data.dat', datas2, fmt='%s', delimiter='\t') #Save   the data
print ('DONE')
于 2013-01-11T16:25:33.370 に答える