我们如何格式化像这个泡菜的数据

时间:2017-07-02 20:14:14

标签: python python-3.x pandas

我正在尝试使用PyUpset包,它在pickel中有测试数据,可以找到here

我可以运行以下代码来查看数据的内容和格式

from pickle import load
with open('./test_data_dict.pckl', 'rb') as f:
   data_dict = load(f)
data_dict

显示数据为以下格式,它只是一个示例,

   [495 rows X 4 columns],
    'adventure':          title rating_avg \
        0                20,000 Leagues Under the Sea (1954)    3.702609    
        1                 7th Voyage of Sinbad, The (1958)      3.616279

             rating_std views
        0     0.869685    575  
        1     0.931531    258  

     [281 rows x 4 columns],
    'romance':          title rating_avg \
        0                'Til There Was You (1997)    2.402609    
        1                 1-900 (1994)                2.411279

             rating_std views
        0     0.669685    575  
        1     0.981310    245  

我一直在尝试以这种方式格式化我的csv数据,而我能得到的最接近的就是将pandas用于这样的事情

csv文件采用以下格式,

Type_A, Type_B, Type_C
x1,x2,x3
y1,y2,y3

使用pandas导入数据帧并在添加索引后将它们连接在一起

import pandas as pd
df=pd.read_csv(csv_file)
d1=df.Type_A.tolist()
d2=df.Type_B.tolist()
d3=df.Type_C.tolist()

然后添加使用enumerate()

的索引
d1_df=list(enumerate(d1, 1))
d2_df=list(enumerate(d2, 1))
d3_df=list(enumerate(d3, 1))
d1_df  # this gives me [(1, 'x1'), (2, 'y1')]

接下来,我将标签Id和Value添加到dataframe

labels = ['Id','Value']
d1_df = pd.DataFrame.from_records(d1_df, columns=labels)
d2_df = pd.DataFrame.from_records(d2_df, columns=labels)
d3_df = pd.DataFrame.from_records(d3_df, columns=labels)


d1_df  # this gives me Id Value
       #            0   1    x1
       #            1   2    y1

然后将所有3组合成一个数据帧并重新定义Type_A,Type_B和Type_C

child_df = [d1_df, d2_df, d3_df]
labels2 = ['Type_A','Type_B','Type_C']

parent_df = pd.concat(child_df, keys=['Type_A', 'Type_B', 'Type_C'])

parent_df # out below


#          Id Value
#Type_A 0   1    x1
#       1   2    y1
#Type_B 0   1    x2
#       1   2    y2
#Type_C 0   1    x3
#       1   2    y3

这是我被击中的地方,我认为我使用了错误的方法,并且以PyUpset使用的格式获取数据应该更简单。

2 个答案:

答案 0 :(得分:2)

我认为您需要转置表格以使其处于“长”格式。一旦你这样做,你可以在pandas中使用groupby方法为pyupset创建正确的字典。

import pandas as pd
try:
    # for Python 2.x
    from StringIO import StringIO
except ImportError:
    # for Python 3.x
    from io import StringIO

test_string = StringIO("""Type_A,Type_B,Type_C
x1,x2,x3
y1,y2,y3""")

df = pd.read_csv(test_string)
df = pd.melt(df, var_name='type')
# df now looks like this:
#
#    type      value
# 0  Type_A    x1
# 1  Type_A    y1
# 2  Type_B    x2
# 3  Type_B    y2
# 4  Type_C    x3
# 5  Type_C    y3

pyupset_data = {key: df.loc[value] for key, value in df.groupby("type").groups.items()}

答案 1 :(得分:0)

我认为它实际上只是一个简单的python dict,其值为整个数据帧。关键是你想要在底行的标题。