Попытка удалить пустые строки и сохранить строки JSON во фрейме данных - PullRequest
0 голосов
/ 04 октября 2018

Это очень, очень странно, но я предполагаю, что есть простое решение ... Я просто еще не нашел его.Я пытаюсь удалить все пустые строки из фрейма данных и сохранить все строки с данными.Вот мои настройки.

26                                                  []
27                                                  []
28                                                  []
29                                                  []
..                                                 ...
270  [{'id': 360014322992, 'default': True, 'name':...
271  [{'id': 360014322992, 'default': True, 'name':...
272  [{'id': 360014322992, 'default': True, 'name':...

В конечном счете, я хочу перейти к этому.

df1 = [{'id': 36001, 'default': False, 'name': 'Production', 'raw_name': 'Production', 'value': 'production'}, {'id': 3600, 'default': False, 'name': 'Development', 'raw_name': 'Development', 'value': 'development'}, {'id': 36001, 'default': False, 'name': 'Staging', 'raw_name': 'Staging', 'value': 'staging'}]
df2 = pd.DataFrame.from_dict(json_normalize(df1), orient='columns')
print(df2)

Однако это не работает для строк, которые имеют только [] символов.Как я могу удалить строки только с [] или как я могу кодировать это, чтобы игнорировать символы [] и нормализовать этот фрейм данных?TIA.

Когда я пытаюсь это:

df2 = df1[~df1.astype(bool)]
print(df2)

Я получаю это:

28                    []
29                    []
..                   ...
270                  NaN
271                  NaN

Когда я пытаюсь это:

df2 = df1[df1 != '[]']
print(df2)

Iполучить это:

28                                                  []
29                                                  []
..                                                 ...
270  [{'id': 360014322992, 'default': True, 'name':...
271  [{'id': 360014322992, 'default': True, 'name':...

Когда я пытаюсь это:

df2 = df1[df1.astype(bool)]
print(df2)

я получаю это:

28                                                 NaN
29                                                 NaN
..                                                 ...
270  [{'id': 360014322992, 'default': True, 'name':...
271  [{'id': 360014322992, 'default': True, 'name':...

Я все еще не могу нормализовать JSON в данныхкадр !!

df2 = pd.DataFrame.from_dict(pd.io.json.json_normalize(df2), orient='columns')
print(df2)

AttributeError: 'str' object has no attribute 'values'

1 Ответ

0 голосов
/ 04 октября 2018

Использование:

a = [{'id': 36001, 'default': False, 'name': 'Production', 'raw_name': 'Production', 'value': 'production'}, {'id': 3600, 'default': False, 'name': 'Development', 'raw_name': 'Development', 'value': 'development'}, 
     {'id': 36001, 'default': False, 'name': 'Staging', 'raw_name': 'Staging', 'value': 'staging'}]

s = pd.Series([[],[],a,a, np.nan])
print(s)
0                                                   []
1                                                   []
2    [{'id': 36001, 'default': False, 'name': 'Prod...
3    [{'id': 36001, 'default': False, 'name': 'Prod...
4                                                  NaN

#remove values with `NaN`s and empty lists
s1 = s[s.astype(bool) & s.notnull()]
print (s1)
2    [{'id': 36001, 'default': False, 'name': 'Prod...
3    [{'id': 36001, 'default': False, 'name': 'Prod...
dtype: object

#flatten values with DataFrame constructor 
df = pd.DataFrame([y for x in s1 for y in x])
print (df)
   default     id         name     raw_name        value
0    False  36001   Production   Production   production
1    False   3600  Development  Development  development
2    False  36001      Staging      Staging      staging
3    False  36001   Production   Production   production
4    False   3600  Development  Development  development
5    False  36001      Staging      Staging      staging

Другое решение с удалением пропущенных значений только на dropna:

df = pd.DataFrame([y for x in s.dropna() for y in x])
print (df)
   default     id         name     raw_name        value
0    False  36001   Production   Production   production
1    False   3600  Development  Development  development
2    False  36001      Staging      Staging      staging
3    False  36001   Production   Production   production
4    False   3600  Development  Development  development
5    False  36001      Staging      Staging      staging

Другая идея -фильтровать только списки:

df = pd.DataFrame([y for x in s[[isinstance(x, list) for x in s]] for y in x])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...