sourcecode

Panda는 데이터 프레임을 일련의 튜플로 변환합니다.

copyscript 2022. 9. 26. 21:55
반응형

Panda는 데이터 프레임을 일련의 튜플로 변환합니다.

판다를 사용해 데이터를 조작하고 있기 때문에, 데이터베이스에 일괄 보존하고 싶다고 생각하고 있습니다.이를 위해서는 데이터 프레임을 튜플 배열로 변환해야 하며, 각 튜플은 데이터 프레임의 "행"에 대응합니다.

데이터 프레임은 다음과 같습니다.

In [182]: data_set
Out[182]: 
  index data_date   data_1  data_2
0  14303 2012-02-17  24.75   25.03 
1  12009 2012-02-16  25.00   25.07 
2  11830 2012-02-15  24.99   25.15 
3  6274  2012-02-14  24.68   25.05 
4  2302  2012-02-13  24.62   24.77 
5  14085 2012-02-10  24.38   24.61 

다음과 같은 튜플 배열로 변환합니다.

[(datetime.date(2012,2,17),24.75,25.03),
(datetime.date(2012,2,16),25.00,25.07),
...etc. ]

이 작업을 효율적으로 수행할 수 있는 방법이 없을까요?

list(data_set.itertuples(index=False))

17.1 현재 위의 명령어는 명명된 튜플 목록을 반환합니다.

튜플의 로 하는 는, 「」를 건네 주세요.name=None★★★★★★★★★★★★★★★★★★:

list(data_set.itertuples(index=False, name=None))

그럼 어떻게 해?

subset = data_set[['data_date', 'data_1', 'data_2']]
tuples = [tuple(x) for x in subset.to_numpy()]

팬더용 <0.24 사용

tuples = [tuple(x) for x in subset.values]

일반적인 방법:

[tuple(x) for x in data_set.to_records(index=False)]

★★
많은 데이터 세트가 충분히 크기 때문에 속도/효율성에 신경을 써야 합니다.그래서 저는 그 정신으로 이 해결책을 제안합니다.그것은 또한 간결하다.

, '우리끼리', '우리끼리'는 index에 표시됨

df = data_set.drop('index', 1)

★★★★★★
는 '사용법'을zip ★★★★★★★★★★★★★★★★★」map

list(zip(*map(df.get, df)))

[('2012-02-17', 24.75, 25.03),
 ('2012-02-16', 25.0, 25.07),
 ('2012-02-15', 24.99, 25.15),
 ('2012-02-14', 24.68, 25.05),
 ('2012-02-13', 24.62, 24.77),
 ('2012-02-10', 24.38, 24.61)]

특정 열의 하위 집합을 다루려는 경우에도 유연합니다.이미 표시된 열이 원하는 부분 집합이라고 가정합니다.

list(zip(*map(df.get, ['data_date', 'data_1', 'data_2'])))

[('2012-02-17', 24.75, 25.03),
 ('2012-02-16', 25.0, 25.07),
 ('2012-02-15', 24.99, 25.15),
 ('2012-02-14', 24.68, 25.05),
 ('2012-02-13', 24.62, 24.77),
 ('2012-02-10', 24.38, 24.61)]

무엇이 더 빠를까요?

★★records이 가장 .zipmap ★★★★★★★★★★★★★★★★★」iter_tuples

는 이 게시물에서 얻은 도서관을 이용할 것이다.

from simple_benchmark import BenchmarkBuilder
b = BenchmarkBuilder()

import pandas as pd
import numpy as np

def tuple_comp(df): return [tuple(x) for x in df.to_numpy()]
def iter_namedtuples(df): return list(df.itertuples(index=False))
def iter_tuples(df): return list(df.itertuples(index=False, name=None))
def records(df): return df.to_records(index=False).tolist()
def zipmap(df): return list(zip(*map(df.get, df)))

funcs = [tuple_comp, iter_namedtuples, iter_tuples, records, zipmap]
for func in funcs:
    b.add_function()(func)

def creator(n):
    return pd.DataFrame({"A": random.randint(n, size=n), "B": random.randint(n, size=n)})

@b.add_arguments('Rows in DataFrame')
def argument_provider():
    for n in (10 ** (np.arange(4, 11) / 2)).astype(int):
        yield n, creator(n)

r = b.run()

결과 확인

r.to_pandas_dataframe().pipe(lambda d: d.div(d.min(1), 0))

        tuple_comp  iter_namedtuples  iter_tuples   records    zipmap
100       2.905662          6.626308     3.450741  1.469471  1.000000
316       4.612692          4.814433     2.375874  1.096352  1.000000
1000      6.513121          4.106426     1.958293  1.000000  1.316303
3162      8.446138          4.082161     1.808339  1.000000  1.533605
10000     8.424483          3.621461     1.651831  1.000000  1.558592
31622     7.813803          3.386592     1.586483  1.000000  1.515478
100000    7.050572          3.162426     1.499977  1.000000  1.480131

r.plot()

여기에 이미지 설명 입력

접근법이 하면,data_setdf를 반환한다.listtuples다음과 같이 합니다.

>>> df.set_index(['data_date'])[['data_1', 'data_2']].to_records().tolist()

생산:

[(datetime.datetime(2012, 2, 17, 0, 0), 24.75, 25.03),
 (datetime.datetime(2012, 2, 16, 0, 0), 25.0, 25.07),
 (datetime.datetime(2012, 2, 15, 0, 0), 24.99, 25.15),
 (datetime.datetime(2012, 2, 14, 0, 0), 24.68, 25.05),
 (datetime.datetime(2012, 2, 13, 0, 0), 24.62, 24.77),
 (datetime.datetime(2012, 2, 10, 0, 0), 24.38, 24.61)]

축으로 하는 것은 datetime .Timestamp하는 값datetime.datetime convert_datetime64가 그렇게 하는 의론DateTimeIndex데이터 프레임

됩니다.recarray '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아list를 사용합니다..tolist


사용 사례에 따라 더 일반적인 솔루션은 다음과 같습니다.

df.to_records().tolist()                              # Supply index=False to exclude index

가장 효율적이고 쉬운 방법:

list(data_set.to_records())

이 호출 전에 필요한 열을 필터링할 수 있습니다.

데이터 프레임 리스트를 튜플 리스트로 변경.

df = pd.DataFrame({'col1': [1, 2, 3], 'col2': [4, 5, 6]})
print(df)
OUTPUT
   col1  col2
0     1     4
1     2     5
2     3     6

records = df.to_records(index=False)
result = list(records)
print(result)
OUTPUT
[(1, 4), (2, 5), (3, 6)]

이 답변에는 아직 설명되지 않은 답변이 추가되지 않았지만, 몇 가지 빠른 결과가 나와 있습니다.댓글에 올라온 궁금증은 이걸로 해결이 될 것 같아요.이 세 가지 값에 따르면 모두 O(n)인 것처럼 보입니다.

TL;DR:tuples = list(df.itertuples(index=False, name=None)) ★★★★★★★★★★★★★★★★★」tuples = list(zip(*[df[c].values.tolist() for c in df]))1면이다.

여기에서는, 다음의 3개의 제안의 결과에 대해서, 퀵 스피드 테스트를 실시했습니다.

  1. @pirsquared로부터의 zip 응답:tuples = list(zip(*[df[c].values.tolist() for c in df]))
  2. @wes-mckinney에서 받아들여진 답변:tuples = [tuple(x) for x in df.values]
  3. @ksindi에서 응답하는 반복은name=None@Axel로부터의 제안:tuples = list(df.itertuples(index=False, name=None))
from numpy import random
import pandas as pd


def create_random_df(n):
    return pd.DataFrame({"A": random.randint(n, size=n), "B": random.randint(n, size=n)})

스몰 사이즈:

df = create_random_df(10000)
%timeit tuples = list(zip(*[df[c].values.tolist() for c in df]))
%timeit tuples = [tuple(x) for x in df.values]
%timeit tuples = list(df.itertuples(index=False, name=None))

제공 내용:

1.66 ms ± 200 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
15.5 ms ± 1.52 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
1.74 ms ± 75.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

확대:

df = create_random_df(1000000)
%timeit tuples = list(zip(*[df[c].values.tolist() for c in df]))
%timeit tuples = [tuple(x) for x in df.values]
%timeit tuples = list(df.itertuples(index=False, name=None))

제공 내용:

202 ms ± 5.91 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
1.52 s ± 98.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
209 ms ± 11.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

내 인내심만큼:

df = create_random_df(10000000)
%timeit tuples = list(zip(*[df[c].values.tolist() for c in df]))
%timeit tuples = [tuple(x) for x in df.values]
%timeit tuples = list(df.itertuples(index=False, name=None))

제공 내용:

1.78 s ± 118 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
15.4 s ± 222 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1.68 s ± 96.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

zip 버전과 반복 버전은 서로 신뢰 구간 내에 있습니다.나는 그들이 비밀리에 같은 일을 하고 있다고 의심한다.

하지만 이러한 속도 테스트는 아마 무관할 것이다.컴퓨터 메모리의 한계에 도달하는 데 시간이 많이 걸리지 않습니다.대용량 데이터 세트에서는 이 작업을 해서는 안 됩니다.이렇게 한 후에 이러한 튜플을 사용하는 것은 결국 매우 비효율적이게 됩니다.코드의 큰 병목현상이 될 가능성은 낮기 때문에 가장 읽기 쉽다고 생각되는 버전을 계속 사용하세요.

#try this one:

tuples = list(zip(data_set["data_date"], data_set["data_1"],data_set["data_2"]))
print (tuples)

더 많은 버마적인 방법:

df = data_set[['data_date', 'data_1', 'data_2']]
map(tuple,df.values)

언급URL : https://stackoverflow.com/questions/9758450/pandas-convert-dataframe-to-array-of-tuples

반응형