Как превратить фрейм данных в серию списков?
мне приходилось делать это несколько раз, и я всегда разочарован. У меня есть фрейм данных:
df = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], ['a', 'b'], ['A', 'B', 'C', 'D'])
print df
A B C D
a 1 2 3 4
b 5 6 7 8
Я хочу повернуть df
в:
pd.Series([[1, 2, 3, 4], [5, 6, 7, 8]], ['a', 'b'])
a [1, 2, 3, 4]
b [5, 6, 7, 8]
dtype: object
Я пробовал
df.apply(list, axis=1)
что просто возвращает меня к тому же df
что такое удобный / эффективный способ сделать это?
3 ответов
вы можете сначала преобразовать DataFrame
to numpy array
by values
, затем преобразовать в список и последний создать новый Series
с индексом С df
если нужно более быстрое решение:
print (pd.Series(df.values.tolist(), index=df.index))
a [1, 2, 3, 4]
b [5, 6, 7, 8]
dtype: object
тайминги с небольшим фреймом данных:
In [76]: %timeit (pd.Series(df.values.tolist(), index=df.index))
1000 loops, best of 3: 295 µs per loop
In [77]: %timeit pd.Series(df.T.to_dict('list'))
1000 loops, best of 3: 685 µs per loop
In [78]: %timeit df.T.apply(tuple).apply(list)
1000 loops, best of 3: 958 µs per loop
и:
from string import ascii_letters
letters = list(ascii_letters)
df = pd.DataFrame(np.random.choice(range(10), (52 ** 2, 52)),
pd.MultiIndex.from_product([letters, letters]),
letters)
In [71]: %timeit (pd.Series(df.values.tolist(), index=df.index))
100 loops, best of 3: 2.06 ms per loop
In [72]: %timeit pd.Series(df.T.to_dict('list'))
1 loop, best of 3: 203 ms per loop
In [73]: %timeit df.T.apply(tuple).apply(list)
1 loop, best of 3: 506 ms per loop
панды очень стараются сделать создание фреймов данных удобным. Таким образом, он интерпретирует списки и массивы как то, что вы хотите разделить на столбцы. Я не собираюсь жаловаться, это почти всегда полезно.
Я сделал это одним из двух способов.
1:
# Only works with a non MultiIndex
# and its slow, so don't use it
df.T.apply(tuple).apply(list)
2:
pd.Series(df.T.to_dict('list'))
оба дают вам:
a [1, 2, 3, 4]
b [5, 6, 7, 8]
dtype: object
2 весы лучше.
времени
дано df
гораздо больше df
from string import ascii_letters
letters = list(ascii_letters)
df = pd.DataFrame(np.random.choice(range(10), (52 ** 2, 52)),
pd.MultiIndex.from_product([letters, letters]),
letters)
результаты df.T.apply(tuple).apply(list)
ошибочны, потому что это решение не работает над Мультииндексом.