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 []