pandas сводная таблица со значениями из двух непересекающихся столбцов - PullRequest
1 голос
/ 21 января 2020

У меня есть следующее dataframe:

df = pd.DataFrame({'asset_number': [100, 100, 100, 1001, 1001, 1001, 1015, 1015, 1015],
                   'feature_name': ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'],
                   'value_string': [None, 'xxxx', None, None, 'yyyy', None, None, 'zzzz', None],
                   'value_float': [42.0, None, 2.25, 42.0, None, 2.25, 37.0, None, 2.75]}
)

+--------------+--------------+-----------------+-------------+
| asset_number | feature_name | value_string    | value_float |
+--------------+--------------+-----------------+-------------+
| 100          | a            |                 | 42          |
+--------------+--------------+-----------------+-------------+
| 100          | b            | xxxx            |             |
+--------------+--------------+-----------------+-------------+
| 100          | c            |                 | 2.25        |
+--------------+--------------+-----------------+-------------+
| 1001         | a            |                 | 42          |
+--------------+--------------+-----------------+-------------+
| 1001         | b            | yyyy            |             |
+--------------+--------------+-----------------+-------------+
| 1001         | c            |                 | 2.25        |
+--------------+--------------+-----------------+-------------+
| 1015         | a            |                 | 37          |
+--------------+--------------+-----------------+-------------+
| 1015         | b            | zzzz            |             |
+--------------+--------------+-----------------+-------------+
| 1015         | c            |                 | 2.75        |
+--------------+--------------+-----------------+-------------+

как бы мне этого добиться?

+--------------+----+------+------+
| asset_number | a  | b    | c    |
+--------------+----+------+------+
| 100          | 42 | xxxx | 2.25 |
+--------------+----+------+------+
| 1001         | 42 | yyyy | 2.25 |
+--------------+----+------+------+
| 1015         | 37 | zzzz | 2.75 |
+--------------+----+------+------+

Обратите внимание, что value_string и value_float никогда не перекрываются, моя идея была объединить два столбца в один столбец value и выполнить:

df.pivot('asset_symbol','feature_name', 'value')

1 Ответ

3 голосов
/ 21 января 2020

Используйте Series.fillna для замены пропущенных значений другим столбцом перед pivot, решение работает правильно, если None в обоих столбцах, последнее для правильных типов данных coerce DataFrame.infer_objects:

df1 = (df.assign(value_string = df['value_string'].fillna(df['value_float']))
         .pivot('asset_number', 'feature_name','value_string')
         .infer_objects()
         .rename_axis(None, axis=1))
print (df1)
                 a     b     c
asset_number                  
100           42.0  xxxx  2.25
1001          42.0  yyyy  2.25
1015          37.0  zzzz  2.75

print (df1.dtypes)
a    float64
b     object
c    float64
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...