【问题标题】:Compare two dataframe and conditionally capture random data in Python在 Python 中比较两个数据框并有条件地捕获随机数据
【发布时间】:2021-05-10 19:40:06
【问题描述】:

我的问题的主要逻辑是稍微比较两个数据框,但这与这里的现有问题有所不同。 Q1Q2Q3

让我们创建两个虚拟数据帧。

data1 = {'user': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4,4], 
         'checkinid': [10, 20, 30, 40, 50, 35, 45, 55, 20, 120, 100, 35, 55, 180, 200,400],
         'count': [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}

data2 = {'checkinid': [10, 20, 30, 35, 40, 45, 50,55, 60, 70,100,120,180,200,300,400]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

data2 由整个 checkinid 值组成。我正在尝试创建一个培训文件。

例如,用户 1 访问了 5 个 id 为 (10,20,30,40,50) 的地方

我想随机添加用户1没有访问的地方并将'计数列'设置为0。

我的期望数据框这样

user checkinid count
1       10        1
1       20        1
1       30        1
1       40        1
1       50        1
1       300       0 (add randomly)
1       180       0 (add randomly)
1       55        0 (add randomly)
2       35        1
2       45        1
2       55        1  
2       20        1
2       120       1
2       10        0 (add randomly)
2       400       0 (add randomly)
2       180       0 (add randomly)
...     ...

现在阅读问题的人可以询问他们将添加多少随机数据。 对于每个用户,只需添加 3 个未访问的地方就足够了。

【问题讨论】:

  • 请通过intro tourhelp centerhow to ask a good question 了解本网站的运作方式并帮助您改进当前和未来的问题,从而帮助您获得更好的答案。 “告诉我如何解决这个编码问题?”与 Stack Overflow 无关。您必须诚实地尝试解决方案,然后就您的实施提出具体问题。 Stack Overflow 无意取代现有的教程和文档。
  • 是的,您找到了如何比较两个数据框,但这不是您面临的问题。您只是找到两个列表的差异(一个简单的研究问题),然后从该差异列表中选择 3 个随机值(另一个简单的研究问题)。由于您缺少发布的代码,我希望您需要查阅 random 包文档。特别注意choicesample

标签: python pandas numpy


【解决方案1】:

这可能不是最好的解决方案,但它确实有效 您必须获取每个用户,然后选择未分配给他们的 checkinids

#get all users
users = df1.user.unique();

for user in users:
    checkins = df1.loc[df1['user'] == user]
    df = checkins.merge(df2, how = 'outer' ,indicator=True).loc[lambda x : x['_merge']=='right_only'].sample(n=3)
    
    df['user']=[user,user,user]
    df['count']=[0,0,0]
    df.pop("_merge")
    df1 = df1.append(df, ignore_index=True)
    
    
#sort data frome based on user
df1 = df1.sort_values(by=['user']);

#re-arrange cols
df1 = df1[['user', 'checkinid', 'count']]

#print df
print df1

【讨论】:

  • 您可以在 df =checkins.merge..... 行中使用 sample(n=3) 而不是 iloc[:3] 随机添加行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多