If you need an ugly solution that also works ... here the function I created finds columns containing only rows and returns df minus those rows. (since your df has only one column, you will just be a dataframe containing 1 column with all dicts). Then from there you will want to use
df = json_normalize(df['A'].values) df = json_normalize(df['A']).
For a single dataframe column ...
import pandas as pd
import numpy as np
from pandas.io.json import json_normalize
def delete_strings(df):
nrows = df.shape[0]
rows_to_keep = []
for row in np.arange(nrows):
if type(df.iloc[row,0]) == dict:
rows_to_keep.append(row)
return df.iloc[rows_to_keep,0]
df = pd.DataFrame({'A': ["hello","world",{"a":5,"b":6,"c":8},"usa","india",
{"a":9,"b":10,"c":11}]})
df = delete_strings(df)
df = json_normalize(df['A'].values)
print(df)
For multi-column df (also works with single df column):
def delete_rows_of_strings(df):
rows = df.shape[0]
cols = df.shape[1]
rows_to_keep = []
for row in np.arange(rows):
num_string = 0
for col in np.arange(cols):
if type(df.iloc[row,col]) == str:
num_string += 1
if num_string != cols:
rows_to_keep.append(row)
return(df.iloc[rows_to_keep,:])
df = pd.DataFrame({'A': ["hello","world",{"a":5,"b":6,"c":8},"usa","india"],
'B' : ['hi',{"a":5,"b":6,"c":8},'sup','america','china']})
print(delete_rows_of_strings(df))
source
share