【问题标题】:Populating a dataframe by looking up another dataframe in pandas通过在 pandas 中查找另一个数据框来填充数据框
【发布时间】:2016-06-14 17:53:41
【问题描述】:

我有一个如下所示的 pandas 数据框 (df):

AccountName   AccountName2  DateTime
abc           guest         2016-06-10 20:46
              guest         2016-06-10 21:32
def                         2016-06-10 23:11
                            2016-06-10 23:31
ghi                         2016-06-10 24:41

我需要根据上面的数据框导出一个新的数据框(df1)。 df1 应该有 2 个字段,ResultAccount 和 DateTime。

if(df["AccountName"] != ' '):
 df1["ResultAccount"] = df["AccountName"]
elif(df["AccountName2] != ' '):
 df1["ResultAccount"] = df["AccountName2"]
else:
 df1["ResultAccount"] = "none"

这是我遵循的方法,但 df1 没有按预期填充。任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas dataframe ipython nan


    【解决方案1】:

    我认为您可以先将带有空格的replace 字符串' ' 转换为NaN,然后再将apply 自定义函数flast_valid_index。输出为Dataframe 来自Series ResultAccountdf.DateTime

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'AccountName2': {0: 'guest', 1: 'guest', 2: ' ', 3: ' ', 4: ' '}, 
                       'DateTime': {0: '2016-06-10 20:46', 1: '2016-06-10 21:32', 2: '2016-06-10 23:11', 3: '2016-06-10 23:31', 4: '2016-06-10 24:41'}, 
                       'AccountName': {0: 'abc', 1: ' ', 2: 'def', 3: ' ', 4: 'ghi'}})
    
    print (df)
      AccountName AccountName2          DateTime
    0         abc        guest  2016-06-10 20:46
    1                    guest  2016-06-10 21:32
    2         def               2016-06-10 23:11
    3                           2016-06-10 23:31
    4         ghi               2016-06-10 24:41
    
    df[['AccountName','AccountName2']] = df[['AccountName','AccountName2']].replace(' ',np.nan)
    
    def f(x):
        if x.first_valid_index() is None:
            return 'None'
        else:
            return x[x.first_valid_index()]
    
    ResultAccount = (df[['AccountName','AccountName2']].apply(f, axis=1))
    
    df1 = pd.DataFrame({'ResultAccount':ResultAccount ,'DateTime':df.DateTime}, 
                       columns=['ResultAccount','DateTime'])
    
    print (df1)
      ResultAccount          DateTime
    0           abc  2016-06-10 20:46
    1         guest  2016-06-10 21:32
    2           def  2016-06-10 23:11
    3          None  2016-06-10 23:31
    4           ghi  2016-06-10 24:41
    

    【讨论】:

    • 谢谢。当 AccountName 存在时,将填充 ResultAccount。它不适用于其他 2 种情况 - 即如果 AccountName 为空且 AccountName2 有内容,则 ResultAccount 是 AccountName2 中的内容。此外,如果两者都为空,则不会填充“none”。
    • 好吧,也许我少了点什么。 ResultAccount 列的期望输出是什么?
    • 它不是基于哪个必须是第一个。对不起,如果我没有把我的问题说清楚。要填充“ResultAccount”,首先它应该检查是否(AccountName!= null),如果是,则 ResultAccount = AccountName。否则 ResultAccount = AccountName2。
    • 对不起,我有点困惑。期望的输出是什么? ResultAccount 列中有哪些值?
    • 所需的输出是您在答案中给出的,但是当我应用该功能时我没有得到。 “abc”、“def”和“ghi”按预期填充,但“guest”和“None”未填充。
    【解决方案2】:

    您可以使用np.select。是np.where的多条件泛化:

    import numpy as np
    import pandas as pd
    df = pd.DataFrame(
        {'AccountName': ['abc', ' ', 'def', ' ', 'ghi'],
         'AccountName2': ['guest', 'guest', ' ', ' ', ' '],
         'DateTime': ['2016-06-10 20:46', '2016-06-10 21:32', '2016-06-10 23:11', '2016-06-10 23:31', '2016-06-10 24:41']})
    
    conditions = [df['AccountName'] != ' ', df['AccountName2'] != ' ']
    choices = [df["AccountName"], df["AccountName2"]]
    df['ResultAccount'] = np.select(conditions, choices, default='none')
    

    产量

      AccountName AccountName2          DateTime ResultAccount
    0         abc        guest  2016-06-10 20:46           abc
    1                    guest  2016-06-10 21:32         guest
    2         def               2016-06-10 23:11           def
    3                           2016-06-10 23:31          none
    4         ghi               2016-06-10 24:41           ghi
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多