熊猫数据框中的字典列

Posted

技术标签:

【中文标题】熊猫数据框中的字典列【英文标题】:Dictionary column in pandas dataframe 【发布时间】:2015-06-02 05:50:44 【问题描述】:

我有一个 csv,我正在读入 pandas 数据框。然而,其中一列是字典的形式。这是一个例子:

ColA, ColB, ColC, ColdD
20, 30, "ab":"1", "we":"2", "as":"3","String"

如何将其变成如下所示的数据框:

ColA, ColB, AB, WE, AS, ColdD
20, 30, "1", "2", "3", "String"

编辑 我解决了这个问题,它看起来像这样,但它是一个需要解析的字符串,而不是 dict 对象。

【问题讨论】:

您确定这正是 csv 文件的格式吗?如果是这样,格式是可怕的。为了正确解析,应该从条目中删除前导空格,“...”应该用双引号括起来,“...”中不应该有双引号本身。是否可以重新格式化csv?如果没有,最好的解决方案可能是编写一个 python 函数来重新格式化文件,然后解析它,最后创建一个 DataFrame。或者你的意思是你已经在 DataFrame 中拥有了所有东西?可能我还是有点迷茫。 Splitting dictionary/list inside a Pandas Column into Separate Columns的可能重复 【参考方案1】:

根据https://***.com/a/38231651/454773,您可以使用.apply(pd.Series) 将包含列的dict 映射到新列,然后将这些新列连接回原始数据框减去包含原始dict 的列:

dw=pd.DataFrame( [[20, 30, "ab":"1", "we":"2", "as":"3","String"]],
                columns=['ColA', 'ColB', 'ColC', 'ColdD'])
pd.concat([dw.drop(['ColC'], axis=1), dw['ColC'].apply(pd.Series)], axis=1)

返回:

ColA    ColB    ColdD   ab  as  we
20      30      String  1   3   2

【讨论】:

出色的回答谢谢。正好可以帮助我了解如何提取存储在数据框列中的字典中的值。谢谢。如果你问我 - 更蟒蛇的方式来做到这一点! 我确实有一个与这个问题非常相似的问题:***.com/questions/51027339/… 找不到人回答我的问题,我也会在这里提问。如何将字典的内容只放在一个单元格中而不是跨列? @psychemedia 很好的答案!非常感谢,这对我有类似的案例有帮助!【参考方案2】:

所以从你的一行df开始

    Col A   Col B   Col C                           Col D
0   20      30      u'we': 2, u'ab': 1, u'as': 3  String1

编辑:根据 OP 的评论,我假设我们需要先转换字符串

import ast
df["ColC"] =  df["ColC"].map(lambda d : ast.literal_eval(d))

然后我们将 Col C 转换为 dict,转置它,然后将其连接到原始 df

dfNew = df.join(pd.DataFrame(df["Col C"].to_dict()).T)
dfNew

给你这个

    Col A   Col B   Col C                           Col D   ab  as  we
0   20      30      u'we': 2, u'ab': 1, u'as': 3  String1 1   3   2

然后我们只需要在dfNew中选择我们想要的列

dfNew[["Col A", "Col B", "ab", "we", "as", "Col D"]]

    Col A   Col B   ab  we  as  Col D
0   20      30      1   2   3   String1

【讨论】:

谢谢,但我收到了这个错误:ValueError: If using all scalar values, you must pass an index - 当我尝试执行 dfNew 步骤时。 好的,在 dfNew 步骤之前尝试这两行。我也更新了我的答案。导入 ast df["ColC"] = df["ColC"].map(lambda d : ast.literal_eval(d)) 感谢您的解决方案。有一个看起来像字典的字符串,我花了一段时间才弄清楚我需要转换它。 具有比使用apply快得多的优势。【参考方案3】:

类似的东西呢:

import pandas as pd

# Create mock dataframe
df = pd.DataFrame([
    [20, 30, 'ab':1, 'we':2, 'as':3, 'String1'],
    [21, 31, 'ab':4, 'we':5, 'as':6, 'String2'],
    [22, 32, 'ab':7, 'we':8, 'as':9, 'String2'],
], columns=['Col A', 'Col B', 'Col C', 'Col D'])

# Create dataframe where you'll store the dictionary values
ddf = pd.DataFrame(columns=['AB','WE','AS'])

# Populate ddf dataframe
for (i,r) in df.iterrows():
    e = r['Col C']
    ddf.loc[i] = [e['ab'], e['we'], e['as']]

# Replace df with the output of concat(df, ddf)
df = pd.concat([df, ddf], axis=1)

# New column order, also drops old Col C column
df = df[['Col A', 'Col B', 'AB', 'WE', 'AS', 'Col D']]

print(df)

输出:

Col A Col B AB WE AS Col D 0 20 30 1 2 3 字符串1 1 21 31 4 5 6 字符串2 2 22 32 7 8 9 字符串2

【讨论】:

以上是关于熊猫数据框中的字典列的主要内容,如果未能解决你的问题,请参考以下文章

如何从熊猫数据框中的时间戳列中删除时区

如何获取熊猫数据框中的行,列中具有最大值并保留原始索引?

将列中的所有值复制到熊猫数据框中的新列

如果特定列中的值不是熊猫数据框中的整数,则删除行

如何为熊猫数据框中的每一行映射/替换列中的多个值

熊猫从数据框中的一列中提取部分字符串并将其存储在一个新列中