我有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)
答案 0 :(得分:1)
我认为你不需要循环,更好的是使用pandas函数sub
和div
min
和max
:
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())