【问题标题】:How to copy from a dataframe only all fields associated with a specific user_id to another dataframe?如何仅将与特定 user_id 关联的所有字段从数据帧复制到另一个数据帧?
【发布时间】:2014-04-04 17:22:01
【问题描述】:

我的数据框 df 包含如下表格:

timestamp   user_id val1    val2     val3  val4    val5    val6
01/01/2011  1   100 3    5     100     3       5
01/02/2013  1   8        6     12      15      3
01/07/2012  1   19  57   10    9       6       6        
01/11/2014  3   49  6        12    15      3
21/12/2012  3       240  30    240     30       
01/12/2013  3       63                  
01/12/2013  5   51  63       50

我想知道如何仅将与特定 user_id 关联的所有字段复制到另一个数据框 df1,例如获取如下表:

timestamp   user_id val1    val2     val3  val4    val5    val6
01/01/2011  1   100 3    5     100     3       5
01/02/2013  1   8        6     12      15      3
01/07/2012  1   19  57   10    9       6       6    

提前感谢您的帮助。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    df['user_id'] == 1 将返回一个布尔数组,当 user_id 列中的值等于 1 时,该数组为 True。因此,您可以选择这些行

    df.loc[df['user_id'] == 1]
    

    In [8]: df
    Out[8]: 
        timestamp  user_id  val1  val2  val3  val4  val5  val6
    0  01/01/2011        1   100     3     5   100     3     5
    1  01/02/2013        1     8     6    12    15     3   NaN
    2  01/07/2012        1    19    57    10     9     6     6
    3  01/11/2014        3    49     6    12    15     3   NaN
    4  21/12/2012        3   240    30   240    30   NaN   NaN
    5  01/12/2013        3    63   NaN   NaN   NaN   NaN   NaN
    6  01/12/2013        5    51    63    50   NaN   NaN   NaN
    
    [7 rows x 8 columns]
    
    In [9]: df['user_id'] == 1
    Out[9]: 
    0     True
    1     True
    2     True
    3    False
    4    False
    5    False
    6    False
    Name: user_id, dtype: bool    
    
    In [11]: df.loc[df['user_id'] == 1]
    Out[11]: 
        timestamp  user_id  val1  val2  val3  val4  val5  val6
    0  01/01/2011        1   100     3     5   100     3     5
    1  01/02/2013        1     8     6    12    15     3   NaN
    2  01/07/2012        1    19    57    10     9     6     6
    
    [3 rows x 8 columns]
    

    df[df['user_id'] == 1] 也可以,但我认为不太清楚,因为它使用与选择列相同的语法。


    这是我根据您发布的表格重新构建 DataFrame df 的方法。我已编辑数据以在 user_id 列中包含逗号,以模拟您的实际数据。我保存了

    timestamp   user_id val1    val2     val3  val4    val5    val6
    01/01/2011  1   100 3    5     100     3       5
    01/02/2013  1   8        6     12      15      3
    01/07/2012  1   19  57   10    9       6       6        
    01/11/2014  3   49  6        12    15      3
    21/12/2012  3       240  30    240     30       
    01/12/2013  3       63                  
    01/12/2013  1,500   51  63       50
    

    在一个名为 data 的文件中,然后运行

    import locale
    locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')  # Set a locale which uses commas as the separator
    df = pd.read_table('data', sep='\s+', converters={u'user_id':locale.atoi})
    

    【讨论】:

    • 当我在诸如 n=1, df['user_id'] == n 之类的代码中使用变量时,它似乎不起作用。
    • 由于未知原因,即使 df[df['user_id'] == 1] 对我也不起作用。
    • 好吧,唯一想到为什么它可能不起作用的原因是您的user_id 列是否存储字符串而不是整数。您可以通过查看df['user_id'].dtype 来测试这是否属实。它应该类似于dtype('int64')。如果这是问题的根源,那么您需要修改构建df 的方式。如果这不是问题的根源,请发布重现问题的可运行代码。 “对我不起作用”通常不足以让我们为您提供帮助。
    • 输出为 dtype(O)。它们是对象。
    • 那么一个快速但不太理想的解决方法是将user_id 转换为int dtype: df['user_id'] = df['user_id'].astype('int')。但是,这只是修补问题。更好的解决方案是构造 df 从一开始就拥有正确的 dtype。如果您正在从文本文件中读取数据,那么您可以使用pd.read_table 构造所需的df,如上所示。否则,如果您想获得有关如何正确构建 df 的建议,则必须提供更多详细信息(和代码)以显示您当前如何构建 df
    猜你喜欢
    • 2021-07-02
    • 2016-08-16
    • 2015-09-08
    • 2021-12-12
    • 1970-01-01
    • 2022-10-12
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多