Dataframe使用Pandas Python从类型对象到int / float的列转换

时间:2017-08-10 08:05:24

标签: python pandas csv types sklearn-pandas

情景

我有2个CSV文件(1)u.Data和(2)prediction_matrix我需要读取并写入单个数据帧,一旦完成它就会基于int / float进行群集处理它将包含的值

问题

我已完成将2个CSV组合到1个名为 AllData.csv 的数据帧中,但保存值的列类型现在具有不同的类型(对象),如如下所示(带警告)

sys:1: DtypeWarning: Columns (0,1,2) have mixed types. Specify dtype option on import or set low_memory=False.
UDATA -------------
uid    int64
iid    int64
rat    int64
dtype: object
PRED_MATRIX -------
uid      int64
iid      int64
rat    float64
dtype: object
AllDATA -----------
uid    object
iid    object
rat    object
dtype: object

P.S。我知道如何使用low_memory=False并且只是压制警告。

可能的原因

with open('AllData.csv', 'w') as handle:
    udata_df.to_csv(handle, index=False)
    pred_matrix.to_csv(handle, index=False)

因为,我需要将2个CSV写入单个DF 句柄对象,并且可能会将所有值都转换为其类型。任何可以保留应用相同逻辑的数据类型的东西吗?

到目前为止无益的参考文献:

  1. This one
  2. This two
  3. This too!

2 个答案:

答案 0 :(得分:1)

第二个DataFrame中的标题也存在问题,因此需要参数header=False

with open('AllData.csv', 'w') as handle:
    udata_df.to_csv(handle, index=False)
    pred_matrix.to_csv(handle, index=False, header=False)

另一个解决方案是mode=a,用于追加第二个DataFrame

f = 'AllData.csv'
udata_df.to_csv(f, index=False)
pred_matrix.to_csv(f,header=False, index=False, mode='a')

或使用concat

f = 'AllData.csv'
pd.concat([udata_df, pred_matrix]).to_csv(f, index=False)

<强>示例

udata_df = pd.DataFrame({'uid':[1,2],
                         'iid':[8,9],
                         'rat':[0,3]})

pred_matrix = udata_df * 10

第三行是header

with open('AllData.csv', 'w') as handle:
    udata_df.to_csv(handle, index=False)
    pred_matrix.to_csv(handle, index=False)

f = 'AllData.csv'
df = pd.read_csv(f)
print (df)
   iid  rat  uid
0    8    0    1
1    9    3    2
2  iid  rat  uid
3   80    0   10
4   90   30   20

在参数header=False之后,它正常工作:

with open('AllData.csv', 'w') as handle:
    udata_df.to_csv(handle, index=False)
    pred_matrix.to_csv(handle, index=False, header=False)

f = 'AllData.csv'
df = pd.read_csv(f)
print (df)
   iid  rat  uid
0    8    0    1
1    9    3    2
2   80    0   10
3   90   30   20

模式append解决方案:

f = 'AllData.csv'
udata_df.to_csv(f, index=False)
pred_matrix.to_csv(f,header=False, index=False, mode='a')
df = pd.read_csv(f)
print (df)
   iid  rat  uid
0    8    0    1
1    9    3    2
2   80    0   10
3   90   30   20

concat解决方案:

f = 'AllData.csv'
pd.concat([udata_df, pred_matrix]).to_csv(f, index=False)
df = pd.read_csv(f)
print (df)
   iid  rat  uid
0    8    0    1
1    9    3    2
2   80    0   10
3   90   30   20

答案 1 :(得分:0)

在您的情况下,

with open方法是不必要的,因为您可以简单地连接两个矩阵,然后仅使用如下的pandas将其保存到csv:

df = pd.concat([udata_df, pred_matrix], axis=1) df.to_csv(encoding='utf-8')