【问题标题】:How to dictionary inside a pandas column into separate columns?如何将熊猫列内的字典转换为单独的列?
【发布时间】:2020-09-07 04:21:02
【问题描述】:

每个人。 这个问题已经被别人问过了。 Splitting dictionary/list inside a Pandas Column into Separate Columns

我已经问过这个问题了。但这并没有解决。 How to use pandas to build a column which are in a dataframe

现在,我有一个数据框。看起来像这样。

                     intron_id                                            octamer
0       >ENSG00000183943.1  AGCCATGC:1 AGUAGCUG:1 GCCUGGCC:1 AGAUGAUG:1 AG...
1       >ENSG00000183943.2  CATATTTC:1 UCCCAAAA:1 AAGCCATA:1 TATTTTGC:1 TA...
2       >ENSG00000183943.3  AGUAGCUG:4 UCAACAGG:1 CCUUUCAU:1 UACCUUUU:1 GC...
3       >ENSG00000183943.4  AUGAGCAC:1 UCCUACGG:1 GGAGGATC:1 AUAGGGUG:1 CC...
4       >ENSG00000183943.5  UUGCCAAU:1 AUGCUGGG:1 ACUAUUUU:1 GGAGGATC:3 UG...

现在,我想把它改成这样。

    intron_id   AGCCATGA AGUAGCUG  GCCUGGCC ......
>ENSG00000183943.1  1      1         1
>ENSG00000183943.2  0      0        0
>ENSG00000183943.3   0      0         0

但是当我尝试使用 apply(pd.Series) 或 df.octamer.values.tolist() 时,它们都不起作用。我很困惑。希望你能给我一些建议。先感谢您。我的代码如下。

    import pandas as pd

df=pd.read_csv('~/10genomic/elife/octamer/intron_seq/count.txt',delimiter='\t',header=None)
df.rename(columns={0:"intron_id",1:"octamer"},inplace=True)
df['octamer']=df['octamer'].apply(lambda x:str(x))
print(df)


                 intron_id                                            octamer
0       >ENSG00000183943.1  AGCCATGC:1 AGUAGCUG:1 GCCUGGCC:1 AGAUGAUG:1 AG...
1       >ENSG00000183943.2  CATATTTC:1 UCCCAAAA:1 AAGCCATA:1 TATTTTGC:1 TA...
2       >ENSG00000183943.3  AGUAGCUG:4 UCAACAGG:1 CCUUUCAU:1 UACCUUUU:1 GC...
3       >ENSG00000183943.4  AUGAGCAC:1 UCCUACGG:1 GGAGGATC:1 AUAGGGUG:1 CC...
4       >ENSG00000183943.5  UUGCCAAU:1 AUGCUGGG:1 ACUAUUUU:1 GGAGGATC:3 UG...

df.drop(labels=[2370,3967,5728,11875,14464],axis=0,inplace=True)


def builddict(x):
    dictls=[]
    for item in x.split(" "):
        dictls.append(item.split(":"))
    return(dict(dictls))

df['octamer']=df['octamer'].apply(builddict)
print(df)


                intron_id                                            octamer
0       >ENSG00000183943.1  {'AGCCATGC': '1', 'AGUAGCUG': '1', 'GCCUGGCC':...
1       >ENSG00000183943.2  {'CATATTTC': '1', 'UCCCAAAA': '1', 'AAGCCATA':...
2       >ENSG00000183943.3  {'AGUAGCUG': '4', 'UCAACAGG': '1', 'CCUUUCAU':...
3       >ENSG00000183943.4  {'AUGAGCAC': '1', 'UCCUACGG': '1', 'GGAGGATC':...
4       >ENSG00000183943.5  {'UUGCCAAU': '1', 'AUGCUGGG': '1', 'ACUAUUUU':...

print(df['octamer'].apply(pd.Series))


                                                      0
0      {'AGCCATGC': '1', 'AGUAGCUG': '1', 'GCCUGGCC':...
1      {'CATATTTC': '1', 'UCCCAAAA': '1', 'AAGCCATA':...
2      {'AGUAGCUG': '4', 'UCAACAGG': '1', 'CCUUUCAU':...
3      {'AUGAGCAC': '1', 'UCCUACGG': '1', 'GGAGGATC':...
4      {'UUGCCAAU': '1', 'AUGCUGGG': '1', 'ACUAUUUU':...

当我尝试如下解决它时,它产生了这个错误。我真的很困惑。

    df=pd.read_csv('~/10genomic/elife/octamer/intron_seq/countdict.txt',delimiter=',',index_col=0)
df=df.iloc[:3,:]
print(df)
            intron_id                                            octamer
0  >ENSG00000183943.1  {'AGCCATGC': '1', 'AGUAGCUG': '1', 'GCCUGGCC':...
1  >ENSG00000183943.2  {'CATATTTC': '1', 'UCCCAAAA': '1', 'AAGCCATA':...
2  >ENSG00000183943.3  {'AGUAGCUG': '4', 'UCAACAGG': '1', 'CCUUUCAU':...

temp_df=pd.DataFrame.from_records(df.pop("octamer"))
print(temp_df)
0     1     2     3     4     5      ... 73895 73896 73897 73898 73899 73900
0     {     '     A     G     C     C  ...  None  None  None  None  None  None
1     {     '     C     A     T     A  ...  None  None  None  None  None  None
2     {     '     A     G     U     A  ...     :           '     1     '     }

【问题讨论】:

  • 请提供来自 count.txt 的样本数据,以便我们进行测试。
  • 你的预期结果是什么?
  • 我已经更改了这个问题。希望你能给我一些建议。谢谢!@Mike67
  • 我已经更改了这个问题。希望你能给我一些建议。谢谢 ! @juanpa.arrivillaga

标签: python dataframe


【解决方案1】:

您可能会尝试遍历两列并创建单独的字典。这个解决方案不是最有效的,但我认为它可以完成工作。

我会创建一个包含所有键列表的字典:

dict = {'intron_id':[], 'AGCCATGC':[], etc..}

然后循环遍历 df 的每一行并遍历字典:

for index, row in df.iterrows():
    dict['intron_id'].append(row['intron_id'])
    for key, value in row['octamer'].iteritems():
        dict[key].append(value)

然后使用字典重新创建数据框。 Pandas DataFrame from Dictionary with Lists

这应该可以完成工作。可能存在一些语法问题,但希望对您有所帮助。

【讨论】:

  • 好的,谢谢。我会尝试你的解决方案。感谢您的帮助!
  • @ruiyanhou 好的,让我知道进展如何。我很好奇这是否有效。如果没有,我很乐意为您提供帮助。如果它确实有效,您可以将其标记为正确吗?非常感谢!
【解决方案2】:

首先是一些假数据:

import pandas as pd


df = pd.DataFrame(data={
    "intron_id": ["A", "B"],
    "octamer": [{'AGCCATGC': '1', 'AGUAGCUG': '1'}, {'CATATTTC': '1', 'UCCCAAAA': '1'}],
})

print(df)

然后提取包含字典的列并将其传递给from_records 以创建我们的新数据框

temp_df = pd.DataFrame.from_records(df.pop("octamer"))
print(temp_df)

最后将我们的原始数据框与我们的新数据框合并,使用索引作为键

df = df.merge(temp_df, left_index=True, right_index=True)
print(df)

等等! (至少我认为这就是你想要的)

编辑
如果我的值真的只是看起来像字典的字符串,我会得到类似的乱码结果。您可以通过从列中提取单个值并检查其类型来确认这一点:

df = pd.read_csv('~/10genomic/elife/octamer/intron_seq/countdict.txt',delimiter=',',index_col=0)
df = df.iloc[:3,:]
first_octamer = df["octamer"][0]
print(type(first_octamer))

我怀疑你会看到<class 'str'> 结果。如果是这样,我们可以使用ast.literal_eval 尝试将字符串解析为实际的字典:

temp_df = df.pop("octamer")
temp_df = temp_df.apply(ast.literal_eval)
temp_df = pd.DataFrame.from_records(temp_df)

df = df.merge(temp_df, left_index=True, right_index=True)
print(df)

我希望你的字符串格式正确,否则事情可能会变得棘手......

【讨论】:

  • 感谢您的帮助。但是当我尝试你的方法时。它不适用于我的数据。我的过程显示在最后一个答案中。我不知道问题出在哪里。希望能得到您的帮助!
  • 感谢您的帮助!但是当我尝试你的方法时,它对我的​​数据不起作用。希望能得到您的答复!该过程在我的最后一个问题中!
猜你喜欢
  • 2021-01-06
  • 2019-07-29
  • 2020-03-28
  • 2021-10-24
  • 1970-01-01
  • 2021-08-18
  • 2020-05-07
  • 2020-03-21
  • 2016-09-06
相关资源
最近更新 更多