我尝试使用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。
答案 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警告是由于datacolumns
是indexed
的视图,即它的行/列的一个子集,而不是它自己的对象。查看这部分文档: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, ...)
我不确定它是否完全符合您的要求,但让我知道,我可以编辑。