我正在尝试获取多个csv文件(15 x 15矩阵),将它们展平为1D矩阵,然后使用python将它们逐行写入新的csv文件。
输入csv文件的示例:
0,1,1,1,1,1,1,1,1,0,0,0,0,0,0
0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
....
....
这是我目前使用的方法:
import pandas as pd
import glob
import numpy as np
path = r'.../Model_AMs'
allFiles = glob.glob(path + "/*.csv")
for file_ in allFiles:
df = pd.read_csv(file_, header=None).values.flatten()
np.savetxt('trainingdata.csv', df, newline=" ", delimiter=',')
然而,当我打开trainingdata.csv
时,它看起来像这样:
0.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00
它没有使用','来分隔元素,并且还添加了大量的0而不是简单地将值保持为1或0。
任何帮助将不胜感激。谢谢
答案 0 :(得分:1)
此时您正在将一行写入您的文件(并通过之前覆盖该行)。正如@hpaulj在评论中指出的那样,你可以考虑使用2D数组。
以下是2D案例的示例:
import numpy as np
df = np.arange(15*15)
df = df.reshape(15,15)
print df
np.savetxt('trainingdata.csv', df, fmt='%i', newline=" ", delimiter=',')
fmt
参数将值格式化为您希望的整数。
如果你真的想要覆盖之前的行或使用一维数组,否则它可以保存如下:
import numpy as np
df = np.arange(15*15)
df = df.reshape(15,15)
for i in range(15):
np.savetxt('trainingdata2.csv', [df[i]], fmt='%i', newline=" ", delimiter=',')
注意[df[i]]
在将1D数组写入文件之前有效地生成1D数组的2D数组。这可以防止您描述的逗号问题。原因是,通过使用[df[i]]
,您告诉np.savetxt
您希望1行包含15列。如果输入包含15个元素的简单1D数组,则会将其解释为15行,每行1列。您没有意识到这一点,因为您设置newline = ' '
的值会导致它们位于文件的同一行,尽管它们实际上是由空格分隔的多个“行”。
答案 1 :(得分:0)
2d数组方法比较简洁,但这里只能用pandas来实现:
import pandas as pd
import glob
path = r'.../Model_AMs'
allFiles = glob.glob(path + "/*.csv")
for file_ in allFiles:
# transpose() is here to order values in same way as
# numpy's flatten(). astype() shouldn't be necessary,
# but useful just in case pandas finds some floating
# point values in your data
df = pd.read_csv(file_, header=None).astype(int).transpose().melt()
# writing in append mode
pd.DataFrame(dict(zip(df.index, df.value)), index=[0]).to_csv(
'trainingdata.csv', index=False, header=False, mode='a')