熊猫中具有相同名称的多个列

Posted

技术标签:

【中文标题】熊猫中具有相同名称的多个列【英文标题】: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 它工作正常 【参考方案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 这个问题和答案可以用来得到你想要的。如果它对您来说不够具体,请提出一个新问题。 ***.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】:

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

    在我的数据框中创建重复列的列表(指多次出现的列名):
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
    使用函数.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 次的列进行修改。

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

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”替换为您正在搜索的列的名称。

【讨论】:

以上是关于熊猫中具有相同名称的多个列的主要内容,如果未能解决你的问题,请参考以下文章

有效地指定具有相同前缀的多个列名称

识别具有相同值的下一行并创建新的列熊猫数据框

将数组列表作为列附加到具有相同列索引的熊猫数据框中

熊猫将具有相同索引的一列值组合到列表中[重复]

Spring Boot JPA:将一个实体映射到具有相同列的多个(很多)表

Python:我有具有相同列名的熊猫数据框。如何改变其中之一?