Convert a Pandas DataFrame to a dictionary

前端 未结 7 872
悲哀的现实
悲哀的现实 2020-11-22 08:07

I have a DataFrame with four columns. I want to convert this DataFrame to a python dictionary. I want the elements of first column be keys and the elements of o

相关标签:
7条回答
  • 2020-11-22 08:23

    If you don't mind the dictionary values being tuples, you can use itertuples:

    >>> {x[0]: x[1:] for x in df.itertuples(index=False)}
    {'p': (1, 3, 2), 'q': (4, 3, 2), 'r': (4, 0, 9)}
    
    0 讨论(0)
  • 2020-11-22 08:24

    Follow these steps:

    Suppose your dataframe is as follows:

    >>> df
       A  B  C ID
    0  1  3  2  p
    1  4  3  2  q
    2  4  0  9  r
    

    1. Use set_index to set ID columns as the dataframe index.

        df.set_index("ID", drop=True, inplace=True)
    

    2. Use the orient=index parameter to have the index as dictionary keys.

        dictionary = df.to_dict(orient="index")
    

    The results will be as follows:

        >>> dictionary
        {'q': {'A': 4, 'B': 3, 'D': 2}, 'p': {'A': 1, 'B': 3, 'D': 2}, 'r': {'A': 4, 'B': 0, 'D': 9}}
    

    3. If you need to have each sample as a list run the following code. Determine the column order

    column_order= ["A", "B", "C"] #  Determine your preferred order of columns
    d = {} #  Initialize the new dictionary as an empty dictionary
    for k in dictionary:
        d[k] = [dictionary[k][column_name] for column_name in column_order]
    
    0 讨论(0)
  • 2020-11-22 08:25

    The to_dict() method sets the column names as dictionary keys so you'll need to reshape your DataFrame slightly. Setting the 'ID' column as the index and then transposing the DataFrame is one way to achieve this.

    to_dict() also accepts an 'orient' argument which you'll need in order to output a list of values for each column. Otherwise, a dictionary of the form {index: value} will be returned for each column.

    These steps can be done with the following line:

    >>> df.set_index('ID').T.to_dict('list')
    {'p': [1, 3, 2], 'q': [4, 3, 2], 'r': [4, 0, 9]}
    

    In case a different dictionary format is needed, here are examples of the possible orient arguments. Consider the following simple DataFrame:

    >>> df = pd.DataFrame({'a': ['red', 'yellow', 'blue'], 'b': [0.5, 0.25, 0.125]})
    >>> df
            a      b
    0     red  0.500
    1  yellow  0.250
    2    blue  0.125
    

    Then the options are as follows.

    dict - the default: column names are keys, values are dictionaries of index:data pairs

    >>> df.to_dict('dict')
    {'a': {0: 'red', 1: 'yellow', 2: 'blue'}, 
     'b': {0: 0.5, 1: 0.25, 2: 0.125}}
    

    list - keys are column names, values are lists of column data

    >>> df.to_dict('list')
    {'a': ['red', 'yellow', 'blue'], 
     'b': [0.5, 0.25, 0.125]}
    

    series - like 'list', but values are Series

    >>> df.to_dict('series')
    {'a': 0       red
          1    yellow
          2      blue
          Name: a, dtype: object, 
    
     'b': 0    0.500
          1    0.250
          2    0.125
          Name: b, dtype: float64}
    

    split - splits columns/data/index as keys with values being column names, data values by row and index labels respectively

    >>> df.to_dict('split')
    {'columns': ['a', 'b'],
     'data': [['red', 0.5], ['yellow', 0.25], ['blue', 0.125]],
     'index': [0, 1, 2]}
    

    records - each row becomes a dictionary where key is column name and value is the data in the cell

    >>> df.to_dict('records')
    [{'a': 'red', 'b': 0.5}, 
     {'a': 'yellow', 'b': 0.25}, 
     {'a': 'blue', 'b': 0.125}]
    

    index - like 'records', but a dictionary of dictionaries with keys as index labels (rather than a list)

    >>> df.to_dict('index')
    {0: {'a': 'red', 'b': 0.5},
     1: {'a': 'yellow', 'b': 0.25},
     2: {'a': 'blue', 'b': 0.125}}
    
    0 讨论(0)
  • 2020-11-22 08:29

    Try to use Zip

    df = pd.read_csv("file")
    d= dict([(i,[a,b,c ]) for i, a,b,c in zip(df.ID, df.A,df.B,df.C)])
    print d
    

    Output:

    {'p': [1, 3, 2], 'q': [4, 3, 2], 'r': [4, 0, 9]}
    
    0 讨论(0)
  • 2020-11-22 08:29

    DataFrame.to_dict() converts DataFrame to dictionary.

    Example

    >>> df = pd.DataFrame(
        {'col1': [1, 2], 'col2': [0.5, 0.75]}, index=['a', 'b'])
    >>> df
       col1  col2
    a     1   0.1
    b     2   0.2
    >>> df.to_dict()
    {'col1': {'a': 1, 'b': 2}, 'col2': {'a': 0.5, 'b': 0.75}}
    

    See this Documentation for details

    0 讨论(0)
  • 2020-11-22 08:34

    For my use (node names with xy positions) I found @user4179775's answer to the most helpful / intuitive:

    import pandas as pd
    
    df = pd.read_csv('glycolysis_nodes_xy.tsv', sep='\t')
    
    df.head()
        nodes    x    y
    0  c00033  146  958
    1  c00031  601  195
    ...
    
    xy_dict_list=dict([(i,[a,b]) for i, a,b in zip(df.nodes, df.x,df.y)])
    
    xy_dict_list
    {'c00022': [483, 868],
     'c00024': [146, 868],
     ... }
    
    xy_dict_tuples=dict([(i,(a,b)) for i, a,b in zip(df.nodes, df.x,df.y)])
    
    xy_dict_tuples
    {'c00022': (483, 868),
     'c00024': (146, 868),
     ... }
    

    Addendum

    I later returned to this issue, for other, but related, work. Here is an approach that more closely mirrors the [excellent] accepted answer.

    node_df = pd.read_csv('node_prop-glycolysis_tca-from_pg.tsv', sep='\t')
    
    node_df.head()
       node  kegg_id kegg_cid            name  wt  vis
    0  22    22       c00022   pyruvate        1   1
    1  24    24       c00024   acetyl-CoA      1   1
    ...
    

    Convert Pandas dataframe to a [list], {dict}, {dict of {dict}}, ...

    Per accepted answer:

    node_df.set_index('kegg_cid').T.to_dict('list')
    
    {'c00022': [22, 22, 'pyruvate', 1, 1],
     'c00024': [24, 24, 'acetyl-CoA', 1, 1],
     ... }
    
    node_df.set_index('kegg_cid').T.to_dict('dict')
    
    {'c00022': {'kegg_id': 22, 'name': 'pyruvate', 'node': 22, 'vis': 1, 'wt': 1},
     'c00024': {'kegg_id': 24, 'name': 'acetyl-CoA', 'node': 24, 'vis': 1, 'wt': 1},
     ... }
    

    In my case, I wanted to do the same thing but with selected columns from the Pandas dataframe, so I needed to slice the columns. There are two approaches.

    1. Directly:

    (see: Convert pandas to dictionary defining the columns used fo the key values)

    node_df.set_index('kegg_cid')[['name', 'wt', 'vis']].T.to_dict('dict')
    
    {'c00022': {'name': 'pyruvate', 'vis': 1, 'wt': 1},
     'c00024': {'name': 'acetyl-CoA', 'vis': 1, 'wt': 1},
     ... }
    
    1. "Indirectly:" first, slice the desired columns/data from the Pandas dataframe (again, two approaches),
    node_df_sliced = node_df[['kegg_cid', 'name', 'wt', 'vis']]
    

    or

    node_df_sliced2 = node_df.loc[:, ['kegg_cid', 'name', 'wt', 'vis']]
    

    that can then can be used to create a dictionary of dictionaries

    node_df_sliced.set_index('kegg_cid').T.to_dict('dict')
    
    {'c00022': {'name': 'pyruvate', 'vis': 1, 'wt': 1},
     'c00024': {'name': 'acetyl-CoA', 'vis': 1, 'wt': 1},
     ... }
    
    0 讨论(0)
提交回复
热议问题