【问题标题】:Setting a column value based on another column in a pandas dataframe根据熊猫数据框中的另一列设置列值
【发布时间】:2015-09-30 05:45:37
【问题描述】:

我有一个数据框,主要填充与程序输入字段相关的文本数据,用于跟踪测试结果。我的专栏之一跟踪程序中的屏幕位置,我想在对输入字段进行排序时保持屏幕的顺序。我意识到我可以通过为我的屏幕设置一个类别来做到这一点,但我担心从测试计划中导入拼写错误,所以我想在单独的列中为我的每个屏幕设置一个数值并将其用于我的排序。

现在我的数据是这样的:

Screen Order   Screen       Input Field  Result
               Screen A     ....         ....
               Screen A     ....         ....
               Screen B     ....         ....
               Screen C     ....         ....
               Screen D     ....         ....
               Screen D     ....         ....
               Screen E     ....         ....

我试图让它看起来像这样,尽管屏幕可能出现故障:

Screen Order   Screen       Input Field  Result
1              Screen A     ....         ....
1              Screen A     ....         ....
2              Screen B     ....         ....
3              Screen C     ....         ....
4              Screen D     ....         ....
4              Screen D     ....         ....
5              Screen E     ....         ....

我已经搜索了几个小时,但没有任何东西可以工作,尽管我觉得这应该很简单。我认为解决方案将使用字典和 applymap() 函数,但我无法找到任何关于如何让解决方案在新列上工作的好的文档,只有当我要更改现有值时在我的屏幕列中。

如果这是重复的,我深表歉意,但我一直在寻找并没有找到任何解决方案。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    EDIT1:不一样,你需要字典来转换。

    dic = {'Screen A': 1, 'Screen B': 2, 'Screen C': 3,'Screen D': 4,'Screen E': 5}
    print df
         Screen
    0  Screen A
    1  Screen A
    2  Screen B
    3  Screen C
    4  Screen D
    5  Screen D
    6  Screen E
    
    df['Screen Order'] = df['Screen'].apply(lambda x: dic[x])
    #reordering
    df = df[['Screen Order', 'Screen' ]]
    
    print df
       Screen Order    Screen
    0             1  Screen A
    1             1  Screen A
    2             2  Screen B
    3             3  Screen C
    4             4  Screen D
    5             4  Screen D
    6             5  Screen E
    

    我将最后一个字符转换为数字。 更多关于转换的信息是here

    print df
         Screen
    0  Screen A
    1  Screen A
    2  Screen B
    3  Screen C
    4  Screen D
    5  Screen D
    6  Screen E
    
    #convert each last letter from column screen to number
    # https://stackoverflow.com/a/4528997/2901002
    df['Screen Order'] = df['Screen'].apply(lambda x: ord(x[-1].lower()) - 96)
    #reordering columns
    df = df[['Screen Order', 'Screen' ]]
    
    print df
       Screen Order    Screen
    0             1  Screen A
    1             1  Screen A
    2             2  Screen B
    3             3  Screen C
    4             4  Screen D
    5             4  Screen D
    6             5  Screen E
    

    【讨论】:

    • 感谢您的回复。出于简单的原因,我使用了屏幕 A、B 等名称,但这些名称实际上类似于策略信息或客户数据,因此我实际上没有可以轻松转换的单个字符。我需要找到一种方法,允许我将整个名称转换为屏幕顺序而不是单个字符。
    • 好的,我添加下一个解决方案。
    • 字典参考的更新解决了我的问题。感谢您提供额外的反馈和修改。
    猜你喜欢
    • 1970-01-01
    • 2016-08-09
    • 2021-07-15
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2017-10-14
    • 2021-06-25
    相关资源
    最近更新 更多