>source

그래서 두 개의 다른 모집단에서 무작위 샘플링으로 1000개의 t-검정 결과를 생성하기 위해 루프를 만들고 싶었습니다. 내 루프는 기본적으로 필요한 작업을 수행합니다. 유일한 문제는 인쇄 결과를 데이터 프레임에 추가하고 싶다는 것입니다.

results= pd.DataFrame({'Effect Size':[], 'p-value':[]})
for i in range(1000):
    sample1= np.random.normal(0,1,1000)
    sample2= np.random.normal(.05,1,1000)
    effect_size, pvalue= stats.ttest_ind(a=sample1, b=sample2, equal_var=True)
    results= pd.DataFrame(print(effect_size,pvalue))
results.head()

그러나 내가 얻는 결과는 다음과 같습니다.

-1.6143890836641985 0.10660095803269495
-2.0260421693695845 0.0428931041087038
-2.7052945035320413 0.006882349977869199
-0.650014611610562 0.5157575104187226
0.35589181647004076 0.721959156357101
-1.8580323211600547 0.0633114210246122
-2.1346234965598185 0.03291315538511747
-1.5619392256304192 0.11846067349115201
-1.4286159705357937 0.15327094637955832
-2.5338588520198324 0.011357254651096133
-1.125224663298795 0.2606289939128222
-1.8130036805024503 0.06998125666628215
-0.0350581349501468 0.9720368863172242
-0.14942653694599559 0.881232154213759
-1.3726021387765257 0.17003011697766837
-0.391077951258786 0.6957813156125576
-1.8118048538852072 0.07016643231973188
_

내가 원하는 출력은 위에서 만든 데이터 프레임의 2개의 개별 열에 2개의 값을 첨부하는 것입니다. 어떤 해결책이 있습니까?

  • 답변 # 1

    먼저 결과를 수집한 다음 데이터 프레임을 생성합니다.

    import pandas as pd
    import numpy as np
    import scipy.stats as stats
    results= []
    for i in range(1000):
        sample1= np.random.normal(0,1,1000)
        sample2= np.random.normal(.05,1,1000)
        effect_size, pvalue= stats.ttest_ind(a=sample1, b=sample2, equal_var=True)
        results.append([effect_size, pvalue])
    df= pd.DataFrame(results, columns=['Effect Size', 'p-value'])
    

    출력:

    >>> df
         Effect Size   p-value
    0      -1.490185  0.136333
    1      -1.541894  0.123258
    2      -1.761850  0.078248
    3      -1.423281  0.154811
    4      -1.399392  0.161851
    ..           ...       ...
    995    -2.137380  0.032688
    996    -0.510703  0.609615
    997     0.260885  0.794208
    998    -3.361631  0.000789
    999    -1.648494  0.099409
    [1000 rows x 2 columns]
    

    업데이트 루프를 피할 수 있습니다.

    # I used only 10 iterations here for better understanding
    sample1= np.random.normal(0, 1, (10, 1000))
    sample2= np.random.normal(.05, 1, (10, 1000))
    effect_size, pvalue= stats.ttest_ind(a=sample11, b=sample21, axis=1, equal_var=True)
    df= pd.DataFrame({'Effect Size': effect_size, 'p-value': pvalue})
    print(df)
    # Output
       Effect Size   p-value
    0    -1.154039  0.248622
    1    -0.590073  0.555208
    2    -0.722039  0.470355
    3    -1.088286  0.276600
    4    -1.337602  0.181178
    5    -0.756837  0.449237
    6    -1.875409  0.060882
    7    -1.532000  0.125681
    8    -1.032455  0.301984
    9    -2.358115  0.018464
    

    감사합니다! 이것은 @piterbarg가 우리에게 준 것에 대한 대안 솔루션입니다. 하지만 결과는 같습니다. 도와 주셔서 감사합니다! 나도 이 솔루션에 정말 가까이 갔지만 어딘가에서 길을 잃었다.

    Mr. Timedying2022-01-15 08:47:58

    정말 더 빠른 업데이트 솔루션을 사용해야 합니다.

    Corralien2022-01-15 08:48:28
  • 답변 # 2
    1. Python print는 아무 것도 반환하지 않으므로 DataFrame 객체 안에 넣어도 해당 데이터 프레임에 값이 추가되지 않습니다.

    2. 루프가 반복될 때마다 새 데이터 프레임을 구성하므로 새 항목을 추가하지 않습니다.

    3. 데이터 프레임에 새 항목을 추가하려면 다음을 사용하십시오.result.append(pd.Dataframe({'col1': effect_size, 'col2': p_value})

  • 답변 # 3

    이 작업은 다음을 사용하여 작동합니다.위치기능 및 제거인쇄

    results= pd.DataFrame({'Effect Size':[], 'p-value':[]})
    for i in range(1000):
        sample1= np.random.normal(0,1,1000)
        sample2= np.random.normal(.05,1,1000)
        effect_size, pvalue= stats.ttest_ind(a=sample1, b=sample2, equal_var=True)
        results.loc[i,:]= [effect_size,pvalue]
    

    감사합니다. 이 솔루션은 매력을 작동합니다. 데이터 세트에 대해 반복을 수행해야 한다는 직감이 있었고 이 [1,:]을 "인수"로 가질 수 있다는 사실을 놓쳤기 때문에 loc 함수를 간과했습니다.

    Mr. Timedying2022-01-15 08:46:22

    @미스터타임다잉. 데이터 프레임에 데이터를 추가하는 것은 좋지 않습니다. 이 솔루션은 루프를 사용하여 데이터를 수집하고 데이터 프레임을 한 번 만드는 것보다 두 배 느립니다.

    Corralien2022-01-15 08:47:59
  • 이전 c : void 포인터를 역참조한 후 int로 캐스팅하는 것이 맞습니까?
  • 다음 java : 텍스트 입력 레이아웃 배경을 제거하는 방법