如何编写pandas

时间:2018-02-11 19:46:23

标签: python pandas

我有38列,我正在逐个预处理。每列的结果必须写在csv文件中。每次运行代码时,只有最后处理的列是用csv编写的。如何使用pandas将每列逐个添加到输出文件中?

这是我的代码:

def min_max(my_data1):

for j in range (38):
    count = 0+j
    #print(my_data1[count])
    #get the min and max for each cloumn
    min_col= min(my_data1[count])
    max_col= max(my_data1[count])
    #print('Min','|','Max')
    #print(min_col,'|',max_col)
    value= (my_data1[count]-min_col)/(max_col-min_col)
    #new_value= value.append(value)
    #print(new_value)

    #my= pd.read_csv('C:\\Users\\Desktop\\minmax.csv',header=None, sep=",")
    df= pd.DataFrame(value)
    df.to_csv('C:\\Users\\Desktop\\minmax.csv', sep=',', na_rep='', float_format=None,header=True, index=True, index_label=None)

min_max(my_data1)

1 个答案:

答案 0 :(得分:1)

我认为你不需要循环,更好的是使用pandas函数subdiv minmax

a = my_data1.sub(my_data1.min(axis=0))
b = my_data1.max(axis=0).sub(my_data1.min(axis=0))

df = a.div(b)

<强>示例

np.random.seed(100)
my_data1 = pd.DataFrame(np.random.randint(10, size=(3,5)))
print (my_data1)
   0  1  2  3  4
0  8  8  3  7  7
1  0  4  2  5  2
2  2  2  1  0  8

我的解决方案:

a = my_data1.sub(my_data1.min(axis=0))
b = my_data1.max(axis=0).sub(my_data1.min(axis=0))

df = a.div(b)
print (df)
      0         1    2         3         4
0  1.00  1.000000  1.0  1.000000  0.833333
1  0.00  0.333333  0.5  0.714286  0.000000
2  0.25  0.000000  0.0  0.000000  1.000000

但如果确实需要循环较慢的解决方案,请将值追加到list和最后concat

def min_max(my_data1):
    L = []
    for count in range (len(my_data1.columns)):
        min_col= my_data1[count].min()
        max_col= my_data1[count].max()
        value= (my_data1[count]-min_col) / (max_col-min_col)
        L.append(value)
    return pd.concat(L, axis=1)

df = min_max(my_data1)
print (df)
      0         1    2         3         4
0  1.00  1.000000  1.0  1.000000  0.833333
1  0.00  0.333333  0.5  0.714286  0.000000
2  0.25  0.000000  0.0  0.000000  1.000000

<强>计时

In [334]: %timeit min_max(my_data1)
18.8 ms ± 257 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [335]: %timeit my_data1.sub(my_data1.min(axis=0)).div(my_data1.max(axis=0).sub(my_data1.min(axis=0)))
2.2 ms ± 39.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
np.random.seed(100)
my_data1 = pd.DataFrame(np.random.randint(10, size=(1000,38)))
print (my_data1.head())

def min_max(my_data1):
    L = []
    for count in range (len(my_data1.columns)):
        min_col= my_data1[count].min()
        max_col= my_data1[count].max()
        value= (my_data1[count]-min_col) / (max_col-min_col)
        L.append(value)
    return pd.concat(L, axis=1)

df1 = min_max(my_data1)
print (df1.head())

df2 = my_data1.sub(my_data1.min(axis=0)).div(my_data1.max(axis=0).sub(my_data1.min(axis=0)))
print (df2.head())