Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将数据帧列中的值映射到数字序列_Python_Pandas_Dataframe - Fatal编程技术网

Python 将数据帧列中的值映射到数字序列

Python 将数据帧列中的值映射到数字序列,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样一个数据帧(请丢弃第一列): 因此,我想将该值映射为从0开始的整数值: 12136 -> 0 72349 -> 1 72672 -> 2 同样,对于创建的_at列(从最小值开始) 最后,我应该有这个数据框(注意,对于没有用户活动的日期,添加了0个值): 我还需要获得以下列表: label1 = [12136, 72349, 72672] label2 = ['2017-02-16', '2017-02-17', '2017-02-19', '2017-02-20']

我有这样一个数据帧(请丢弃第一列):

因此,我想将该值映射为从0开始的整数值:

12136 -> 0
72349 -> 1 
72672 -> 2
同样,对于创建的_at列(从最小值开始)

最后,我应该有这个数据框(注意,对于没有用户活动的日期,添加了0个值):

我还需要获得以下列表:

label1 = [12136, 72349, 72672]
label2 = ['2017-02-16', '2017-02-17', '2017-02-19', '2017-02-20']

我想知道是否有任何方法可以帮助我高效地执行此操作?

您可以将列转换为类别并获得映射字典

df['user_id']= df['user_id'].astype('category')
label1 = dict(enumerate(df['user_id'].cat.categories))
df['created_at']= df['created_at'].astype('category')
label2 = dict(enumerate(df['created_at'].cat.categories))
现在将列值转换为类别代码

df[['user_id', 'created_at']] = df[['user_id', 'created_at']].apply(lambda x: x.cat.codes)
你得到

    user_id created_at  count
1   0       2           4
2   0       0           4
3   0       1           2
4   1       1           8
5   1       2           2
7   2       3           3
8   2       2           2
标签1

{0: 12136, 1: 72349, 2: 72672}
标签2

{0: '2017-02-16', 1: '2017-02-17', 2: '2017-02-19', 3: '2017-02-20'}

我的解决方案将每列中的唯一值转换为
np.array
,并使用
np.argwhere
获取排序后的索引,然后将其放回
数据帧中。您可以将每个转换放在一个行程序中,如下所示:

# Just creating your DataFrame
df = pd.DataFrame({'user_id': [12136, 12136, 12136, 72349, 72349, 
                                    72672, 72672],
                        'created_at': ['2017-02-19', '2017-02-16',
                                       '2017-02-17', '2017-02-17',
                                       '2017-02-19', '2017-02-20',
                                       '2017-02-19'],
                        'count': [4, 4, 2, 8, 2, 3, 2]})
label1 = np.sort(np.array(df.user_id.unique()))
label2 = pd.to_datetime(np.sort(np.array(df.created_at.unique())))

df['user_id'] = df.apply(lambda x: np.argwhere(label1 == x.user_id)[0][0], 
                         axis=1)
df['created_at'] = df.apply(lambda x: np.argwhere(label2 == x.created_at)[0][0], axis=1)
首先,获取您的列表

list1 = df.user_id.unique()
print(list1)
array([12136, 72349, 72672])

list2 = df.created_at.unique()
print(list2)
array(['2017-02-19', '2017-02-16', '2017-02-17', '2017-02-20'], dtype=object)
将在
列中创建的
用户id
转换为
cat
代码

df['user_id'] = df['user_id'].astype('category').cat.codes
df['created_at'] = df['created_at'].astype('category').cat.codes

print(df)
   user_id  created_at  count
1        0           2      4
2        0           0      4
3        0           1      2
4        1           1      8
5        1           2      2
7        2           3      3
8        2           2      2

使用
groupby
reindex
操作

df = df.set_index('created_at').groupby('user_id', as_index=False)\
       .apply(lambda x: x.reindex(df.created_at.unique()))\
       .sort_index().reset_index([1])
清理你的专栏

df.user_id = df.groupby(level=0).user_id.transform(lambda x: x.ffill().bfill())
df['count'] = df['count'].fillna(0)

print(df.astype(int))

   created_at  user_id  count
0           0        0      4
0           1        0      2
0           2        0      4
0           3        0      0
1           0        1      0
1           1        1      8
1           2        1      2
1           3        1      0
2           0        2      0
2           1        2      0
2           2        2      2
2           3        2      3

以下是我最后的答案:

dfx_users = pd.DataFrame({'user_id': df['user_id'].unique(), 'u_id': range(0, len(df['user_id'].unique()))})
dfx_users['key'] = 1

dfx_dates = pd.DataFrame({'created_at': df['created_at'].unique(), 'd_id': range(0, len(df['created_at'].unique()))})
dfx_dates['key'] = 1

dfxx = pd.merge(dfx_users, dfx_dates, on='key').drop('key', 1)
dfxx.sort_values(['user_id', 'created_at'], ascending=[True, True])

dfxx.merge(dfx[['user_id', 'created_at', 'count']], 
           on=['user_id', 'created_at'], how='left').fillna(0)[['u_id', 'd_id', 'count']]


u_id    d_id        count
0       0           4
0       1           2
0       2           4
0       3           0
1       0           0
1       1           8
1       2           2
1       3           0
2       0           0
2       1           0
2       2           2
2       3           3 

为什么这被标记为“太宽泛:请编辑问题,将其限制为特定问题,并提供足够详细的信息,以确定适当的答案”
!!!原因是,它似乎不是一个单一的、具体的问题——它是一个需求列表,是一个一般性的问题,想知道是否有任何方法可以提供帮助。问题应给出一个特定编码相关问题的清晰轮廓,展示研究证据和自己解决问题的尝试,并将任何相关代码包含在问题中,以便我们有足够的信息帮助您解决该问题。这并不能完全回答问题…?感谢您的回答!我很感激@renakre Np,只是想确定你知道自己在做什么。。我在下面发布了另一种方法。不知道最好的是什么。。。我想从专家那里学习新的方法,以及如何和在哪里使用它们。再次感谢。分类表上的类别是Unique;不需要单独计算;它们自然会作为因式分解的一部分返回
df = df.set_index('created_at').groupby('user_id', as_index=False)\
       .apply(lambda x: x.reindex(df.created_at.unique()))\
       .sort_index().reset_index([1])
df.user_id = df.groupby(level=0).user_id.transform(lambda x: x.ffill().bfill())
df['count'] = df['count'].fillna(0)

print(df.astype(int))

   created_at  user_id  count
0           0        0      4
0           1        0      2
0           2        0      4
0           3        0      0
1           0        1      0
1           1        1      8
1           2        1      2
1           3        1      0
2           0        2      0
2           1        2      0
2           2        2      2
2           3        2      3
dfx_users = pd.DataFrame({'user_id': df['user_id'].unique(), 'u_id': range(0, len(df['user_id'].unique()))})
dfx_users['key'] = 1

dfx_dates = pd.DataFrame({'created_at': df['created_at'].unique(), 'd_id': range(0, len(df['created_at'].unique()))})
dfx_dates['key'] = 1

dfxx = pd.merge(dfx_users, dfx_dates, on='key').drop('key', 1)
dfxx.sort_values(['user_id', 'created_at'], ascending=[True, True])

dfxx.merge(dfx[['user_id', 'created_at', 'count']], 
           on=['user_id', 'created_at'], how='left').fillna(0)[['u_id', 'd_id', 'count']]


u_id    d_id        count
0       0           4
0       1           2
0       2           4
0       3           0
1       0           0
1       1           8
1       2           2
1       3           0
2       0           0
2       1           0
2       2           2
2       3           3