熊猫中具有相同名称的多个列
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”替换为您正在搜索的列的名称。
【讨论】:
以上是关于熊猫中具有相同名称的多个列的主要内容,如果未能解决你的问题,请参考以下文章