【问题标题】:Swap cells strings from 2 dataframe columns从 2 个数据框列交换单元格字符串
【发布时间】:2012-09-20 19:10:44
【问题描述】:

我正在努力从数据框的 2 列交换值,如下所示:

rs649071 rs640249 0.265 0.49 
rs647621 rs640249 0.227 0.34 
rs644339 rs640249 0.116 0.08 
rs641563 rs640249 1.0 33.96 
rs640249 rs11073074 0.248 0.77 
rs640249 rs11637397 0.194 0.68 

这个想法是测试第 2 列的每个单元格是否为 rs640249,如果不是,则从第 1 列更改为相应的字符串,反之亦然。这样最终的结果会是这样的:

rs649071 rs640249 0.265 0.49 
rs647621 rs640249 0.227 0.34 
rs644339 rs640249 0.116 0.08 
rs641563 rs640249 1.0 33.96 
rs11073074 rs640249 0.248 0.77 
rs11637397 rs640249 0.194 0.68 

我试图迭代元组,但是,元组不支持项目分配。

rscode='rs640249'
for inf in LDfiles:
    df = read_csv(inf, sep='\t', skiprows=1, names=['A', 'B', 'C'])
    for tup in df.itertuples():
        if tup[2] != rscode:
            tup[1], tup[2] = tup[2], tup[1]
        print(tup)

【问题讨论】:

  • 您可以使用list(tup) 将元组转换为列表并进行切换。

标签: python dataframe pandas compare-and-swap


【解决方案1】:

为什么不试试这样的数组操作:

condition = df['L1'] == 'rs640249'
tmp = df['L1'].copy()
df['L1'][condition] = df['L2'][condition]
df['L2'][condition] = tmp[condition]

【讨论】:

    【解决方案2】:

    一种方法是使用apply

    def my_fun(row):
        if row['col1'] == 'rs640249':
            return row['col2'], row['col1']
        else:
            return row['col1'], row['col2']
    
    df = df.apply(my_fun, axis=1)
    

    如果您只想更改一列中的值,您仍然可以使用apply

    def my_fun2(row, colID):
        if row[colID][0] == 'rs640249':
            return row[colID][::-1] #reverse the tuple
        else:
            return row[colID]
    
    df[colID] = df.apply(lambda x: my_fun2(x, colID), axis=1)
    

    注意:由于my_fun2返回的是单个值,所以这次apply返回的是一个Series,所以我们需要稍微改变一下apply的方式。

    例子:

    df
    #                             0
    # 0    ('rs649071', 'rs640249')
    # 1  ('rs640249', 'rs11073074')
    
    df[0] = df.apply(lambda x: my_fun2(x,0), axis=1)
    #                             0
    # 0    ('rs649071', 'rs640249')
    # 1  ('rs11073074', 'rs640249')
    

    【讨论】:

    • 嗨,海登,感谢您的帮助。这正是我喜欢做的事情。但是,它似乎对我不起作用。我使用了索引,因为行是元组(如果 row[0]== 'rs...'):row[0], row[1] = row[1], row[0])。
    • 另外,元组是不可变的!这就是为什么事情不顺利。问题仍然没有解决。任何帮助表示赞赏。
    • 啊哈!它们是元组 :) 更新了,这应该可以解决,我之前的代码中也缺少 return
    【解决方案3】:

    对于未来的裁判,这里有一个可能的解决方案:

        for row_index, row in df.iterrows():
            if row['L1'] == 'rs640249':
                df.set_value(row_index, 'L1' , row['L2'])
                df.set_value(row_index, 'L2' , row['L1'])
    

    最好的,

    【讨论】:

    • @hayden:感谢 cmets,也许这不是最好的方法,但是,它工作得很好。当然, iterrows 会创建不必要的系列,但是,我无法按照您的建议使事情正常进行:我有空数据框和一堆错误。我怀疑熊猫版本(0.8.1)和/或python(3.2)。你测试了吗?
    • 这很奇怪。你使用的是哪个 pandas 和 python 版本?
    • @hayden:如果您有兴趣,请查看errors
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2020-08-01
    • 2019-03-24
    相关资源
    最近更新 更多