Pandas格式化DataFrame中的列并添加timedelta Index错误

时间:2015-06-09 19:18:17

标签: python pandas

我尝试使用panda对某些消息传递数据进行一些分析,并遇到一些问题尝试准备数据。它来自我无法控制的数据库,因此在分析之前我需要进行一些修剪和格式化。

这是我到目前为止所处的位置:

#select all the messages in the database. Be careful if you get the whole test data base, may have 5000000 messages.
full_set_data = pd.read_sql("Select * from message",con=engine)

在我对时间戳进行此更改并将其设置为索引后,我不再需要调用to_csv。

#convert timestamp to a timedelta and set as index
#full_set_data[['timestamp']] = full_set_data[['timestamp']].astype(np.timedelta64)
indexed = full_set_data.set_index('timestamp')
indexed.to_csv('indexed.csv')

#extract the data columns I really care about since there as a bunch I don't need
datacolumns = indexed[['address','subaddress','rx_or_tx', 'wordcount'] + [col for col in indexed.columns if ('DATA' in col)]]

这里我需要格式化DATA列,我得到一个" SettingWithCopyWarning"。

#now need to format the DATA columns to something useful by removing the upper 4 bytes
for col in datacolumns.columns:
  if 'DATA' in col:
    datacolumns[col] = datacolumns[col].apply(lambda x : int(x,16) & 0x0000ffff)

datacolumns.to_csv('data_col.csv')


#now group the data by "interaction key"
groups = datacolumns.groupby(['address','subaddress','rx_or_tx'])

我需要弄清楚如何从给定的组中获取所有消息。 get_group()要求我提前知道关键值。

key_group = groups.get_group((1,1,1))
#foreach group in groups:
  #do analysis

我已经尝试了所有我想到的东西来解决我遇到的问题,但我似乎无法绕过它。我确定我误解/误用了熊猫,因为我还在搞清楚它。

我希望解决这些问题:

1)添加时间戳索引为timedelta64后,无法保存到csv

2)如何在重新格式化DATA列时将函数应用于一组列以删除SettingWithCopyWarning。

3)如何在不必使用get_group()的情况下抓取每个组的行,因为我不会提前知道密钥。

感谢您提供任何见解和帮助,以便我更好地了解如何正确使用Pandas。

1 个答案:

答案 0 :(得分:0)

首先,您可以在查询数据库时设置索引列和解析日期:

indexed = pd.read_sql_query("Select * from message", engine=engine,
                            parse_dates='timestamp', index_col='timestamp')

注意我在这里使用了pd.read_sql_query而不是pd.read_sql,我认为这已被弃用了。

SettingWithCopy警告是由于datacolumnsindexed的视图,即它的行/列的一个子集,而不是它自己的对象。查看这部分文档:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

解决这个问题的一种方法是定义

datacolumns = indexed[<cols>].copy()

另一个会做

indexed = indexed[<cols>]
如果您对不再需要它们感到高兴,那么

可以有效地删除您不想要的列。然后,您可以随意操纵indexed。 至于groupby,你可以引入一组元组,它们是组密钥:

indexed['interaction_key'] = zip(indexed[['address','subaddress','rx_or_tx']]
indexed.groupby('interaction_key').apply(
           lambda df: some_function(df.interaction_key, ...)

我不确定它是否完全符合您的要求,但让我知道,我可以编辑。