Python 熊猫群

Python 熊猫群,python,pandas,Python,Pandas,我有数据 mm_id 11.02.2016 12.02.2016 13.02.2016 14.02.2016 15.02.2016 16.02.2016 17.02.2016 b2b5b93270cb217310b0719946b0afee 0 0 0 242 0 0 0 71f464119a2d43834c3b

我有数据

mm_id                           11.02.2016  12.02.2016  13.02.2016  14.02.2016  15.02.2016  16.02.2016  17.02.2016
b2b5b93270cb217310b0719946b0afee    0            0          0           242         0           0           0
71f464119a2d43834c3be0af362487bc    0            23         0           0           0           0           0   
afad5e5f9c3ba9df885eba1557ab7c73    1            0          0           22          0           0           0
我需要将它与数据分组。但我不知道如何转换成另一种格式。 期望输出(我需要获得每个
数据的唯一
ID
列表):


IIUC您可以使用
applymap
numpy广播
pd.melt
groupby
执行以下操作:

In [94]: df
Out[94]:
                              mm_id  11.02.2016  12.02.2016  13.02.2016  14.02.2016  15.02.2016  16.02.2016  17.02.2016  
0  b2b5b93270cb217310b0719946b0afee           0           0           0         242           0           0           0
1  71f464119a2d43834c3be0af362487bc           0          23           0           0           0           0           0
2  afad5e5f9c3ba9df885eba1557ab7c73           1           0           0          22           0           0           0

# values from dates
df_values = df.iloc[:, 1:]

# first change numbers to dummies for dates, i.e. 1 for non zero elements
df2 = df_values.applymap(lambda x: 1 if x >= 1 else 0)        

# fill data with mm_id
df3 = pd.DataFrame(df2.values * df.mm_id[:, None], columns=df2.columns)

# melt all together
df4 = pd.melt(df3, var_name='date', value_name='id') 

# fill empty strings with NaN to drop in the final groupby
df4 = df4.replace('', np.nan)    

# final groupby by date, select id column, and then apply pd.Sereis with dropna and get unique values
df5 = df4.groupby('date')['id'].apply(lambda x: pd.Series(x).dropna().unique())          
每个步骤的结果:

In [133]: df_values
Out[133]:
   11.02.2016  12.02.2016  13.02.2016  14.02.2016  15.02.2016  16.02.2016  17.02.2016
0           0           0           0         242           0           0           0
1           0          23           0           0           0           0           0
2           1           0           0          22           0           0           0

In [146]: df2
Out[146]:
   11.02.2016  12.02.2016  13.02.2016  14.02.2016  15.02.2016  16.02.2016  17.02.2016
0           0           0           0           1           0           0           0
1           0           1           0           0           0           0           0
2           1           0           0           1           0           0           0

In [147]: df3
Out[147]:
                         11.02.2016                        12.02.2016 13.02.2016                        14.02.2016 15.02.2016 16.02.2016 17.02.2016
0                                                                                 b2b5b93270cb217310b0719946b0afee
1                                    71f464119a2d43834c3be0af362487bc
2  afad5e5f9c3ba9df885eba1557ab7c73                                               afad5e5f9c3ba9df885eba1557ab7c73

In [148]: df4
Out[148]:
          date                                id
0   11.02.2016                               NaN
1   11.02.2016                               NaN
2   11.02.2016  afad5e5f9c3ba9df885eba1557ab7c73
3   12.02.2016                               NaN
4   12.02.2016  71f464119a2d43834c3be0af362487bc
5   12.02.2016                               NaN
6   13.02.2016                               NaN
7   13.02.2016                               NaN
8   13.02.2016                               NaN
9   14.02.2016  b2b5b93270cb217310b0719946b0afee
10  14.02.2016                               NaN
11  14.02.2016  afad5e5f9c3ba9df885eba1557ab7c73
12  15.02.2016                               NaN
13  15.02.2016                               NaN
14  15.02.2016                               NaN
15  16.02.2016                               NaN
16  16.02.2016                               NaN
17  16.02.2016                               NaN
18  17.02.2016                               NaN
19  17.02.2016                               NaN
20  17.02.2016                               NaN

In [149]: df5
Out[149]:
date
11.02.2016                   [afad5e5f9c3ba9df885eba1557ab7c73]
12.02.2016                   [71f464119a2d43834c3be0af362487bc]
13.02.2016                                                   []
14.02.2016    [b2b5b93270cb217310b0719946b0afee, afad5e5f9c3...
15.02.2016                                                   []
16.02.2016                                                   []
17.02.2016                                                   []

第一步:转换数据帧

df = df.set_index('mm_id', drop=True).transpose()
输出:

mm_id       b2b5b93270cb217310b0719946b0afee  \
11.02.2016                                 0   
12.02.2016                                 0   
13.02.2016                                 0   
14.02.2016                               242   
15.02.2016                                 0   
16.02.2016                                 0   
17.02.2016                                 0   

mm_id       71f464119a2d43834c3be0af362487bc  afad5e5f9c3ba9df885eba1557ab7c73  
11.02.2016                                 0                                 1  
12.02.2016                                23                                 0  
13.02.2016                                 0                                 0  
14.02.2016                                 0                                22  
15.02.2016                                 0                                 0  
16.02.2016                                 0                                 0  
17.02.2016                                 0                                 0  
第二步:应用函数

In [10]: df.apply(lambda row: row[row != 0].index.tolist(), axis=1)
Out[10]: 
11.02.2016                 ['afad5e5f9c3ba9df885eba1557ab7c73']
12.02.2016                 ['71f464119a2d43834c3be0af362487bc']
13.02.2016                                                   []
14.02.2016    ['b2b5b93270cb217310b0719946b0afee', 'afad5e5f...
15.02.2016                                                   []
16.02.2016                                                   []
17.02.2016                                                   []

这将获取具有非零值的用户id。

需要澄清的是,所需输出中的日期应该是输入中的列?目前情况并非如此……我想改变这一点并获得smth,比如
ID,“day”00051F002F5A0C179D7CE191CA2C64012016-03-01 00051F002F5A0C179D7CE191CA2C64012016-03-03 00051F002F5A0C179D7CE191CA2C64012016-03-04 00051F002F5A0C179D7CE191CA2C64012016-03-05,不要使用该函数返回
值错误:无法将输入数组从形状(9296)广播到形状(18089)
您可以先试试这个,看看吗
df.apply(lambda row:str(row[row!=0].index.tolist()),axis=1)
您能告诉我如何将其写入
excel
?通常我使用
来创建excel
,但它用点来编写列表
[ddc6cc21999d77351381e7e44892ffb9,825b3c223af…,b2b5b93270cb217310b07107b0719946b0afee]
我认为设置索引的
drop=True
是不必要的,它需要
重置索引
@hellmoore,@IanS您也可以使用oneliner:
(df.iloc[:,1:].T*df.mm_id).apply(lambda x:x[x!='').tolist(),axis=1)
感谢您的回答!见上面的答案,有一个决定shortly@hellmoore是的,肯定更简单更快。
In [10]: df.apply(lambda row: row[row != 0].index.tolist(), axis=1)
Out[10]: 
11.02.2016                 ['afad5e5f9c3ba9df885eba1557ab7c73']
12.02.2016                 ['71f464119a2d43834c3be0af362487bc']
13.02.2016                                                   []
14.02.2016    ['b2b5b93270cb217310b0719946b0afee', 'afad5e5f...
15.02.2016                                                   []
16.02.2016                                                   []
17.02.2016                                                   []