将列表作为熊猫数据框中的列值

时间:2019-01-08 15:23:11

标签: python python-3.x pandas

我有一个如下数据框:

Card_x  Country Age     Code        Card_y
S       INDIA   Adult   Garments    S,E,D,G,M,A
S       INDIA   Adult   Grocery     D,S,G,A,M,E

我的列表如下:

lis1 = [S,D,G,E,M,A]

现在我希望我的数据框如下:

说明:按Card_x,Country和Age分组,并将lis1值作为“ Card_y”

Card_x  Country Age     Card_y
S       INDIA   Adult   S,D,G,E,M,A

可以帮我吗?

注意:计算lis1的逻辑如下:

lis1=[]
for i in range(len(t)):
    l=df.Card_y.iloc[i].split(',')
    lis1.append(l)
sorted(lis1[0], key=lambda elem: sum(sublist.index(elem) for sublist in lis1) / len(lis1))

基本上,lis1获得每个Card_y在不同“代码”中的排名,并获得平均排名并重新计算平均得分最少的排名。

例如:S在代码-服装中排名第一,在代码-Grocery.so中排名第二,因此平均值为1 + 2/2 = 1.5

D在代码-服装方面排名第三,在代码-杂货方面排名第一。所以平均值是3 + 1/2 = 2。

现在,基于平均值,以最少的平均值我将获得“排名”列表。 因此它将是S,D,G,E,M,A

1 个答案:

答案 0 :(得分:1)

尝试:

df_out = df.groupby(['Card_x','Country','Age'])['Card_y'].apply(lambda x: x.str.split(',', expand=True)
                                                                  .rename(columns = lambda x: x+1)
                                                                  .stack().reset_index(level=1))

df_out = df_out.groupby(['Card_x','Country','Age',0])['level_1'].mean().sort_values().reset_index(level=-1)

df_out.groupby(['Card_x','Country','Age'])[0].agg(','.join).rename('Card_y').reset_index()

输出:

  Card_x Country    Age       Card_y
0      S   INDIA  Adult  S,D,G,E,A,M