如何将 Pandas DataFrame 转换为 table 向量
How to turn a Pandas DataFrame into a table of vectors
我有一个两列 Pandas 数据框,其中包含 user_ids 的列表和他们访问过的一些 URL。它看起来像这样:
users urls
0 user1 url1
1 user1 url3
2 user1 url5
3 user2 url2
4 user2 url4
5 user2 url5
6 user3 url1
7 user3 url4
8 user3 url5
我想创建自己的矢量表示,如下所示:
url1 url2 url3 url4 url5
user1 1.0 NaN 1.0 NaN 1.0
user2 NaN 1.0 NaN 1.0 1.0
user3 1.0 NaN NaN 1.0 1.0
我尝试过不同的方法,但总是碰壁。有什么想法吗?
重现您的问题:
df = pd.DataFrame([
['user1', 'url1'],
['user1', 'url3'],
['user1', 'url5'],
['user2', 'url2'],
['user2', 'url4'],
['user2', 'url5'],
['user3', 'url1'],
['user3', 'url4'],
['user3', 'url5']
], columns=['users', 'urls'])
我为我的解决方案应用了一个 for 循环。我相信比我更有能力的人可以找到更优雅的解决方案。
new_df = pd.DataFrame()
for user in np.unique(df['users']):
s = pd.get_dummies(df[df['users']==user]['urls']).sum()
s.name = user
new_df = new_df.append(s)
new_df
url1 url3 url5 url2 url4
user1 1.0 1.0 1.0 NaN NaN
user2 NaN NaN 1.0 1.0 1.0
user3 1.0 NaN 1.0 NaN 1.0
如果您希望您的列被排序,您可以简单地应用这个:
new_df = pd.DataFrame(columns=np.unique(df['urls']))
这会初始化新数据框以将您的唯一网址作为列。
url1 url2 url3 url4 url5
user1 1.0 NaN 1.0 NaN 1.0
user2 NaN 1.0 NaN 1.0 1.0
user3 1.0 NaN NaN 1.0 1.0
您所描述的是 url 列的支点
# Make data
df = pd.DataFrame([
['user1', 'url1'],
['user1', 'url3'],
['user1', 'url5'],
['user2', 'url2'],
['user2', 'url4'],
['user2', 'url5'],
['user3', 'url1'],
['user3', 'url4'],
['user3', 'url5']
], columns=['users', 'urls'])
# add column to fill pivoted values
df['count'] = 1
new_df = df.pivot(index='users',columns='urls',values='count').fill_na(0)
new_df
# urls url1 url2 url3 url4 url5
# users
# user1 1.0 0.0 1.0 0.0 1.0
# user2 0.0 1.0 0.0 1.0 1.0
# user3 1.0 0.0 0.0 1.0 1.0
这会将用户列放入索引中,但您可以使用 reset_index 使其再次成为常规列。
我有一个两列 Pandas 数据框,其中包含 user_ids 的列表和他们访问过的一些 URL。它看起来像这样:
users urls
0 user1 url1
1 user1 url3
2 user1 url5
3 user2 url2
4 user2 url4
5 user2 url5
6 user3 url1
7 user3 url4
8 user3 url5
我想创建自己的矢量表示,如下所示:
url1 url2 url3 url4 url5
user1 1.0 NaN 1.0 NaN 1.0
user2 NaN 1.0 NaN 1.0 1.0
user3 1.0 NaN NaN 1.0 1.0
我尝试过不同的方法,但总是碰壁。有什么想法吗?
重现您的问题:
df = pd.DataFrame([
['user1', 'url1'],
['user1', 'url3'],
['user1', 'url5'],
['user2', 'url2'],
['user2', 'url4'],
['user2', 'url5'],
['user3', 'url1'],
['user3', 'url4'],
['user3', 'url5']
], columns=['users', 'urls'])
我为我的解决方案应用了一个 for 循环。我相信比我更有能力的人可以找到更优雅的解决方案。
new_df = pd.DataFrame()
for user in np.unique(df['users']):
s = pd.get_dummies(df[df['users']==user]['urls']).sum()
s.name = user
new_df = new_df.append(s)
new_df
url1 url3 url5 url2 url4
user1 1.0 1.0 1.0 NaN NaN
user2 NaN NaN 1.0 1.0 1.0
user3 1.0 NaN 1.0 NaN 1.0
如果您希望您的列被排序,您可以简单地应用这个:
new_df = pd.DataFrame(columns=np.unique(df['urls']))
这会初始化新数据框以将您的唯一网址作为列。
url1 url2 url3 url4 url5
user1 1.0 NaN 1.0 NaN 1.0
user2 NaN 1.0 NaN 1.0 1.0
user3 1.0 NaN NaN 1.0 1.0
您所描述的是 url 列的支点
# Make data
df = pd.DataFrame([
['user1', 'url1'],
['user1', 'url3'],
['user1', 'url5'],
['user2', 'url2'],
['user2', 'url4'],
['user2', 'url5'],
['user3', 'url1'],
['user3', 'url4'],
['user3', 'url5']
], columns=['users', 'urls'])
# add column to fill pivoted values
df['count'] = 1
new_df = df.pivot(index='users',columns='urls',values='count').fill_na(0)
new_df
# urls url1 url2 url3 url4 url5
# users
# user1 1.0 0.0 1.0 0.0 1.0
# user2 0.0 1.0 0.0 1.0 1.0
# user3 1.0 0.0 0.0 1.0 1.0
这会将用户列放入索引中,但您可以使用 reset_index 使其再次成为常规列。