Измените значения строк с определенным условием, используя значения строк из набора данных json Pandas - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть этот набор данных.

{
    "date": "2018-01-01", 
    "body": "some txt", 
    "id": 111, 
    "sentiment": null
}, 
{
    "date": "2018-01-02", 
    "body": "some txt", 
    "id": 112, 
    "sentiment": {
        "basic": "Bearish"
    }
}

Я хочу прочитать это с пандами и изменить настроение столбца, так как строки отличаются от нуля.

Когда я делаю это:

pd.read_json(path)

это результат, который я получаю:

body           ...    sentiment
0                      None
1                      {u'basic': u'Bullish'}

Я не хочу иметь {u'basic': u'Bullish'}, но толькозначение базового.Поэтому, чтобы найти правильные строки, я использую

df.loc[self.df['sentiment'].isnull() != True, 'sentiment'] = (?)

, и это работает, но я не знаю, что я должен поставить вместо (?)

Я пробовал это, но десяткине работает

df.loc[self.df['sentiment'].isnull() != True, 'sentiment'] = df['sentiment']['basic]

Есть идеи?Спасибо

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Вы можете сделать это:

df = pd.read_json(path)  # creates the dataframe with dict objects in sentiment column 
pd.concat([df.drop(['sentiment'], axis=1), df['sentiment'].apply(pd.Series)], axis=1)  # create new columns for each sentiment type

Так, например, если ваш json:

[{
    "date": "2018-01-01", 
    "body": "some txt", 
    "id": 111, 
    "sentiment": null
}, 
{
    "date": "2018-01-02", 
    "body": "some txt", 
    "id": 112, 
    "sentiment": {
        "basic": "Bearish"
    }
},
{
    "date": "2018-01-03", 
    "body": "some other txt", 
    "id": 113, 
    "sentiment": {
        "basic" : "Bullish",
        "non_basic" : "Bearish"
    }
}]

df после строки 1:

             body       date   id                                     sentiment
0        some txt 2018-01-01  111                                          None
1        some txt 2018-01-02  112                          {'basic': 'Bearish'}
2  some other txt 2018-01-03  113  {'basic': 'Bullish', 'non_basic': 'Bearish'}

dfпосле строки 2:

             body       date   id    basic non_basic
0        some txt 2018-01-01  111      NaN       NaN
1        some txt 2018-01-02  112  Bearish       NaN
2  some other txt 2018-01-03  113  Bullish   Bearish

HTH.

0 голосов
/ 15 ноября 2018

fillna + pop + join

Вот расширяемое решение, которое позволяет избежать построчно applyи преобразует произвольное количество ключей в серии:

df = pd.DataFrame({'body': [0, 1],
                   'sentiment': [None, {u'basic': u'Bullish'}]})

df['sentiment'] = df['sentiment'].fillna(pd.Series([{}]*len(df.index), index=df.index))

df = df.join(pd.DataFrame(df.pop('sentiment').values.tolist()))

print(df)

   body    basic
0     0      NaN
1     1  Bullish
0 голосов
/ 15 ноября 2018

Вы можете попробовать:

mask = df['sentiment'].notnull()
df.loc[mask, 'sentiment'] = df.loc[mask, 'sentiment'].apply(lambda x: x['basic'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...