2016-09-28 63 views
1

将元信息保存到数据框的最佳做法是什么?我知道下面的编码实践如何处理与熊猫数据框关联的元数据?

import pandas as pd 
df = pd.DataFrame([]) 
df.currency = 'USD' 
df.measure = 'Price' 
df.frequency = 'daily' 

,但在这篇文章Adding meta-information/metadata to pandas DataFrame说这与底肥功能,如“GROUPBY,支点,加入或LOC”,因为他们可能会返回“丢失信息的风险没有附加元数据的新数据框“。

这仍然有效,或者在此期间更新了元信息处理吗?什么是另一种编码习惯?

我不认为建立一个单独的对象是非常合适的。使用Multiindex也不能说服我。比方说,我想用数据框与收入来划分数据框。使用Multiindices将会非常重要。

#define price DataFrame 
p_index = pd.MultiIndex.from_tuples([['Apple', 'price', 'daily'],['MSFT', 'price', 'daily']]) 
price = pd.DataFrame([[90, 20], [85, 30], [70, 25]], columns=p_index) 

# define earnings dataframe 
e_index = pd.MultiIndex.from_tuples(
    [['Apple', 'earnings', 'daily'], ['MSFT', 'earnings', 'daily']]) 
earnings=pd.DataFrame([[5000, 2000], [5800, 2200], [5100, 3000]], 
       columns=e_index) 

price.divide(earnings.values, level=1, axis=0) 

在上面的例子中,我甚至没有确保公司指数真的匹配。我可能需要调用一个pd.DataFrame.reindex()或类似的。在我看来,这不是一个好的编码习惯。

在这种情况下,我没有看到处理元信息的问题是否有直接的解决方案?

预先感谢您

回答

0

我认为MultiIndexes是要走的路,但这种方式:

daily_price_data = pd.DataFrame({'Apple': [90, 85, 30], 'MSFT':[20, 30, 25]}) 
daily_earnings_data = pd.DataFrame({'Apple': [5000, 58000, 5100], 'MSFT':[2000, 2200, 3000]}) 
data = pd.concat({'price':daily_price_data, 'earnings': daily_earnings_data}, axis=1) 
data 


    earnings  price 
    Apple MSFT Apple MSFT 
0 5000 2000 90  20 
1 58000 2200 85  30 
2 5100 3000 30  25 

然后分:

data['price']/data['earnings'] 

如果你发现你的工作流程更有意义,让公司在指数的第一级上市,那么pandas.DataFrame.xs将非常有帮助:

data2 = data.reorder_levels([1,0], axis=1).sort_index(axis=1) 
data2.xs('price', axis=1, level=-1)/data2.xs('earnings', axis=1, level=-1)