【问题标题】:Multiple columns with the same name in Pandas熊猫中具有相同名称的多个列
【发布时间】:2017-02-20 13:35:25
【问题描述】:

我正在从 CSV 文件创建 dataframe。我已经浏览了文档、多个 SO 帖子、链接,因为我刚刚开始使用 Pandas 但没有得到它。 CSV 文件有多个具有相同名称的列,例如 a

那么在形成dataframe 之后,当我做df['a'] 时,它会返回哪个值?它不会返回所有值。

也只有一个值会有一个字符串,其余的将是None。我怎样才能得到那个专栏?

【问题讨论】:

  • 回答这个问题:when i do df['a'] which value will it return - 它将返回一个包含 all 列名为 a 的 DF
  • @MaxU 它没有返回所有值...这就是为什么我很惊讶!!!!
  • 我在 Pandas 0.19.0 下测试过——你用的是什么版本?
  • @MaxU 相同....当我使用 like 它工作正常

标签: python python-2.7 csv pandas


【解决方案1】:

相关参数为mangle_dupe_cols

来自docs

mangle_dupe_cols : boolean, default True
    Duplicate columns will be specified as 'X.0'...'X.N', rather than 'X'...'X'

默认情况下,您的所有'a' 列都被命名为'a.0'...'a.N',如上所述。

如果您使用了mangle_dupe_cols=False,则导入此csv 会产生错误。

您可以使用

获取所有列
df.filter(like='a')

演示

from StringIO import StringIO
import pandas as pd

txt = """a, a, a, b, c, d
1, 2, 3, 4, 5, 6
7, 8, 9, 10, 11, 12"""

df = pd.read_csv(StringIO(txt), skipinitialspace=True)
df

df.filter(like='a')

【讨论】:

  • 非常感谢!!!!工作正常.....在我的情况下,只有一个可以有一个值,其余的将是NaN。所以我怎样才能选择唯一的值非 nan 或 nan 是所有值都是 nan
  • @vks 这是一个完全不相关的问题。碰巧最近有人问了这个问题。我会找到它并在这里发布。
  • @vks 这个问题和答案可以用来得到你想要的。如果它对您来说不够具体,请提出一个新问题。 stackoverflow.com/q/39903090/2336654
  • 我没有看到你实际使用参数mangle_dupe_cols。为什么只有我一个迷茫? :)
  • 导入和预处理后如何更改列名?
【解决方案2】:

我有一个类似的问题,不是因为从 csv 读取,而是我有多个具有相同名称的 df 列(在我的例子中是 'id')。我通过使用 df.columns 并使用列表重置列名来解决它。

In : df.columns
Out: 
Index(['success', 'created', 'id', 'errors', 'id'], dtype='object')

In : df.columns = ['success', 'created', 'id1', 'errors', 'id2']

In : df.columns
Out: 
Index(['success', 'created', 'id1', 'errors', 'id2'], dtype='object')

从这里,我可以调用“id1”或“id2”来获得我想要的列。

【讨论】:

    【解决方案3】:

    这就是我通常对我的基因表达数据集所做的事情,其中​​相同的基因名称可能会出现不止一次,因为同一基因的基因序列略有不同:

    1. 在我的数据框中创建重复列的列表(指多次出现的列名):
    duplicated_columns_list = []
    list_of_all_columns = list(df.columns)
    for column in list_of_all_columns:
        if list_of_all_columns.count(column) > 1 and not column in duplicated_columns_list:
            duplicated_columns_list.append(column)
    duplicated_columns_list
    
    1. 使用函数.index() 帮助我找到在每次迭代中重复的第一个元素并在其下划线:
    for column in duplicated_columns_list:
        list_of_all_columns[list_of_all_columns.index(column)] = column + '_1'
        list_of_all_columns[list_of_all_columns.index(column)] = column + '_2'
    

    这个for 循环帮助我强调所有重复的列,现在每列都有一个不同的名称。

    此特定代码与恰好出现 2 次的列相关,但可以针对在数据框中出现甚至超过 2 次的列进行修改。

    1. 最后,使用下划线元素重命名列:

    df.columns = list_of_all_columns

    就是这样,希望对你有帮助:)

    【讨论】:

      【解决方案4】:

      与 JDenman6 类似(并且与您的问题相关),我有两个具有相同名称的 df 列(名为“id”)。 因此,调用

      df['id']
      

      返回 2 列。 你可以使用

      df.iloc[:,ind]
      

      其中 ind 对应于列的索引,根据它们在 df 中的排序方式。您可以使用以下方法查找索引:

      indices = [i for i,x in enumerate(df.columns) if x == 'id']
      

      您将“id”替换为您正在搜索的列的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-26
        • 2021-11-16
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        • 2018-01-21
        • 1970-01-01
        • 2016-08-12
        相关资源
        最近更新 更多