【问题标题】:join columns from merged databases连接合并数据库中的列
【发布时间】:2020-01-19 16:31:12
【问题描述】:

我想添加单个数据框的 2 列。数据帧是两个单个数据帧的结果。代码如下

df1 = pd.read_csv("acc.csv")
df2 = pd.read_csv("gyr.csv")

df = pd.merge(df1, df2, right_index=True, left_index=True)

所以我有列 id、activity、time、accx、accy、accz、id、activity_gur、time、gurx、gury、gurz data.head

df["acc_activity"].value_counts()
sitting          32833
standing         31924
lying            31229
running          30429
climbing_up      26938
walking          26080
climbing_down    25281
jumping           4232
Name: activity, dtype: int64

df["gur_activity"].value_counts()

sitting          33267
standing         32546
walking          31912
lying            31822
running          30958
climbing_down    25786
climbing_up      18343
jumping           4312
Name: activity_gur, dtype: int64

所以我想在现有列中添加一个新列 (SEE DATA.HEAD),它是 activity_gur 和 activity 的总和。因此,在数据头的右侧将添加一个名为活动的新列。例如,此列的爬下活动为 25281+25786=51067。所以在活动列的第 0 行将描述活动向下爬尽可能多的行。其他活动也是如此。当我对 df["activities"].value_counts() 进行 CODE 编码时,它会返回类似上面的内容。之后,我将删除 activity_gur 和 activity 列

我尝试了类似以下的方法:

df1 = pd.DataFrame({'activity': 32833, 31924, 31793, 31229, 30429, 26938, 25281, 4232],
                       'activity_gur': [33267, 32546, 31912, 31822, 30958, 25786, 18343, 4312]})

df['activityfinal']=df1.activity + df1.activity_gur

但结果列只是添加的值,我不知道每个总和来自哪个活动

你能帮帮我吗?

【问题讨论】:

    标签: python pandas dataframe data-analysis sensors


    【解决方案1】:

    测试数据:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({
        'activity' : np.random.choice( ['sitting', 'standing', 'lying', 'running', 'climbing_up', 'walking', 'climbing_down', 'jumping'], 10000),
        'activity_gur' : np.random.choice( ['sitting', 'standing', 'lying', 'running', 'climbing_up', 'walking', 'climbing_down', 'jumping'], 10000)})
    

    第一个 value_counts 对象:

    activity_value_counts = df["activity"].value_counts().sort_index()
    activity_value_counts
    

    输出:

    climbing_down    1222
    climbing_up      1248
    jumping          1274
    lying            1193
    running          1277
    sitting          1283
    standing         1227
    walking          1276
    Name: activity, dtype: int64
    

    第二个 value_counts 对象:

    activity_gur_value_counts = df["activity_gur"].value_counts().sort_index()
    activity_gur_value_counts
    

    输出:

    climbing_down    1238
    climbing_up      1274
    jumping          1236
    lying            1262
    running          1220
    sitting          1259
    standing         1247
    walking          1264
    Name: activity_gur, dtype: int64
    

    最终数据帧:

    df_final = pd.DataFrame({'activity':activity_value_counts})
    df_final['activity_gur'] = activity_gur_value_counts
    df_final['sum'] = df_final['activity'] + df_final['activity_gur']
    df_final
    

    输出:

    然后您可以删除activityactivity_gur 列,并根据需要重命名sum 列。

    【讨论】:

    • 谢谢你的回答 df_final = df_final.drop(['activity', 'gyr_activity'], axis = 1).copy() df_final.head() 我得到总和 crawl_down 51067 crawl_up 45281跳跃 8544 躺着 63051 运行 61387 所以当我写 df_final["sum"].value_counts().sort_index() 我回来 8544 1 45281 1 51067 1 57992 1 61387 1 63051 1 64470 1 66100 1 名称:sum,dtype:int64我不知道每个值是从哪个活动中得出的。我想要的是每个活动都有相应的值作为我的数据。头部链接
    • 还有一件事,请使用您的代码,总和列未添加到我的原始 df 数据框
    • 你是怎么想象的?你能告诉我你期望的结果吗?
    • id activity time accx accy accz id activity_gur time gurx gury gurz sum_activities 0 1 crawl_down 1.44E+12 -9.6642 -1.65067 0.859924 1 crawl_down 1.44E+12 -0.000977 -0.004135 -0.002487 crawl_down activity 和 activity_gur 的总和将用于 51067 行,以此类推其他活动。最后,我将退出活动和活动性_gur 列
    【解决方案2】:

    试试这个

    X = df["activity"].value_counts()
    Y = df["activity_gur"].value_counts()
    RESULT = pd.DataFrame(X + Y, columns=['TOTAL'])
    

    然后更新现有数据框:

    df["TOTAL"] = df["activity"].apply(lambda x: RESULT["TOTAL"].loc[x])
    

    完成上述步骤后,删除列:

    df = df.drop(["activity", "activity_gur"], axis=1)
    

    【讨论】:

    • 活动 activity_gur 攀爬_down NaN NaN 攀爬_up NaN NaN 跳跃 NaN NaN 躺着 NaN NaN 跑步 NaN NaN 坐着 NaN NaN 站立 NaN NaN 行走 NaN NaN 结果充满了 nan 值。 a 还想将新列附加到现有数据框
    • 我看到您的列名不同,这就是为什么 NAN。我已经更新了答案,请尝试一下。
    • 是的,我试试这似乎可行。但请看我的数据头链接。如您所见,第一个活动是登山运动,此活动将用于 25281 列,然后开始其他活动。因此,新列必须具有两列的附加值,但格式与原始列相同,现在我正在采用类似 accx accy accz gurx gury gurz TOTAL 0 -9.66420 -1.65067 0.859924 -0.000977 -0.004135 -0.002487 51067
    • 我只想代替 51067 来显示活动(在本例中为 crawl_down)以及当我调用 crawl_down 来查看其值时
    • 所以代替被描述 51067 我想要活动的名称,因为它描述到要删除的列(活动,gyr_activity)id 活动时间 accx accy accz id gyr_activity time gurx gury gurz 总计 0 1 爬升 1.436000e+12 -9.66420 -1.65067 0.859924 1 爬升 1.436000e+12 -0.000977 -0.004135 -0.002487 51067
    【解决方案3】:

    使用熊猫join

    这样,

    new_data = activity.append(activity_gur, ignore_index=True)
    

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 1970-01-01
      • 2012-10-03
      • 2022-08-18
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多