从python 3中的对象类型[]转换熊猫列

时间:2019-06-23 05:38:15

标签: python-3.x pandas

我已经阅读了此Pandas: convert type of column和这个How to convert datatype:object to float64 in python? 我有df的当前输出:

Day       object
Time      object
Open     float64
Close    float64
High     float64
Low      float64
                 Day          Time   Open  Close   High    Low
0      ['2019-03-25']  ['02:00:00']  882.2  882.6  884.0  882.1
1      ['2019-03-25']  ['02:01:00']  882.9  882.9  883.4  882.9
2      ['2019-03-25']  ['02:02:00']  882.8  882.8  883.0  882.7

所以我不能使用这个:

day_=df.loc[df['Day'] == '2019-06-25']

我的最终目的是通过按特定条件过滤“天”列的值来提取df。 我认为上述df.loc无法执行的原因是Day的dtype是对象,所以我无法执行df.loc 所以我尝试将上面的df转换成这样:

               Day       Time   Open  Close   High    Low
0      2019-03-25  ['02:00:00']  882.2  882.6  884.0  882.1
1      2019-03-25  ['02:01:00']  882.9  882.9  883.4  882.9
2      2019-03-25  ['02:02:00']  882.8  882.8  883.0  882.7

我尝试过:

df=pd.read_csv('output.csv')
df = df.convert_objects(convert_numeric=True)

#df['Day'] = df['CTR'].str.replace('[','').astype(np.float64)
df['Day'] = pd.to_numeric(df['Day'].str.replace(r'[,.%]','')) 

但是它不能处理如下错误:

ValueError: Unable to parse string "['2019-03-25']" at position 0

我是熊猫的新手,可能会重复! 请帮我找到解决方案。非常感谢。

1 个答案:

答案 0 :(得分:1)

尝试此方法,希望它能起作用
首先按天删除列表括号,然后使用.loc

进行过滤
df = pd.DataFrame(data={'Day':[['2016-05-12']],
                       'day2':[['2016-01-01']]})

df['Day'] = df['Day'].apply(''.join)
df['Day'] = pd.to_datetime(df['Day']).dt.date.astype(str)

days_df=df.loc[df['Day'] == '2016-05-12']

第二个解决方案 如果列表存储为字符串

from ast import literal_eval
df2 = pd.DataFrame(data={'Day':["['2016-05-12']"],
                       'day2':["['2016-01-01']"]})
df2['Day'] = df2['Day'].apply(literal_eval)
df2['Day'] = df2['Day'].apply(''.join)
df2['Day'] = pd.to_datetime(df2['Day']).dt.date.astype(str)
days_df=df2.loc[df2['Day'] == '2016-05-12']