Как итеративно заполнять панды Dataframe столбцами - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь создать фрейм данных pandas с итеративным подсчетом статистики из другого фрейма данных, он проходит через столбцы (отфильтрованные с помощью регулярных выражений).Как я могу создать результат Dataframe?Входной фрейм данных:

    In [4]: control.head()
    Out[4]:
  Patient Gender  Age  Left-Lateral-Ventricle_NVoxels  Left-Inf-Lat- 
Vent_NVoxels  ...  supramarginal_CurvInd_lh
0    P008      M   30                            9414                        
311  ...                       7.5
1    P013      F   35                            7668                         
85  ...                      10.4
2    P018      F   27                            7350                        
202  ...                       8.0
3    P033      F   55                            7548                        
372  ...                       9.2
4    P036      F   31                            8598                         
48  ...                       8.0

    [5 rows x 930 columns]

Я написал код для подсчета статистики, но застрял при создании pandas dataframe

def select_volumes(group_c,group_k):
    Select_list = ["Amygdala", "Hippocampus", "Lateral-Ventricle", 
"Pallidum", "Putamen", "Thalamus"]
    Side = ["Left", "Right"]
    for s in Side:
        for struct in Select_list:
            volumes_c = group_c.filter(regex="^(?=.*"+s+")(?=.*"+struct+") 
   (?=.*Volume)")
            volumes_k = group_k.filter(regex="^(?=.*"+s+")(?=.*"+struct+") 
   (?=.*Volume)")
            k = cohens_d(volumes_c, volumes_k)
            meand = volumes_c.mean()
            result_df = pd.Dataframe(
{
     "Cohen's norm": some result
     "Mean Value": meand
}
)
            return k

Функция select_volumes дает мне результат:

Left-Amygdala_Volume_mm3   -0.29729
dtype: float64
Left-Hippocampus_Volume_mm3    0.33139
dtype: float64
Left-Lateral-Ventricle_Volume_mm3   -0.111853
dtype: float64
Left-Pallidum_Volume_mm3    0.28857
dtype: float64
Left-Putamen_Volume_mm3    0.696645
dtype: float64
Left-Thalamus-Proper_Volume_mm3    0.772492
dtype: float64
Right-Amygdala_Volume_mm3   -0.358333
dtype: float64
Right-Hippocampus_Volume_mm3    0.275668
dtype: float64
Right-Lateral-Ventricle_Volume_mm3   -0.092283
dtype: float64
Right-Pallidum_Volume_mm3    0.279258
dtype: float64
Right-Putamen_Volume_mm3    0.484879
dtype: float64
Right-Thalamus-Proper_Volume_mm3    0.809775
dtype: float64

Я хочу, чтобы Left-Amygdala_Volume_mm3 ... была строкой со значением -0.29729 с именем столбца. Коэна d будет столбцом для каждого списка Select_list: пример, как должен выглядеть кадр данных

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Я пишу в pd.Dataframe внутри функции:

k = cohens_d(volumes_c, volumes_k)
meand = volumes_c.mean()    
volumes_df.append([cohen.index[0],cohen.values[0], meand)
return volumes_df

и из функции, которую я вызываю pd.Dataframe с:

finaldf=pd.DataFrame(select_volumes(control,patolog))
finaldf.columns=['Structure','Cohensd','Meand')
0 голосов
/ 21 мая 2019

Я до сих пор не могу понять, как и где, но вы показали, что где-то в функции вы смогли построить серию float64, содержащую, например, Left-Amygdala_Volume_mm3 в качестве индекса и -0.29729 в качестве значения.И я предполагаю, что в то же время у вас есть значение meand для того же значения индекса.

Точнее, я буду предполагать:

k = pd.Series([-0.29729], dtype=np.float64,index=['Left-Amygdala_Volume_mm3'])

, потому что оно печатается как:

print(k)

Left-Amygdala_Volume_mm3   -0.29729
dtype: float64

В то же время я предполагаю, что meand также является аналогичной серией.Таким образом, мы получим доступ к его значению как meand.iloc[0] (допустим, значение равно 9174.1)

Вы должны объединить их, чтобы построить содержимое строки:

row = k.reset_index().iloc[0].tolist() + [meand.iloc[0]]

В нашем примере row: ['Left-Amygdala_Volume_mm3', -0.29729, 9174.1]

Итак, теперь вам нужно построить большой список из этих строк:

def select_volumes(group_c,group_k):
    Select_list = ["Amygdala", "Hippocampus", "Lateral-Ventricle", 
"Pallidum", "Putamen", "Thalamus"]
    Side = ["Left", "Right"]
    data = []
    for s in Side:
        for struct in Select_list:
            volumes_c = group_c.filter(regex="^(?=.*"+s+")(?=.*"+struct+") 
   (?=.*Volume)")
            volumes_k = group_k.filter(regex="^(?=.*"+s+")(?=.*"+struct+") 
   (?=.*Volume)")
            k = cohens_d(volumes_c, volumes_k)
            meand = volumes_c.mean()

            # build a row of result df
            data.append(k.reset_index().iloc[0].tolist() + [meand.iloc[0]])

    # after the loop combine the rows into a dataframe and return it:
    result = pd.DataFrame(data, columns=['index', "Cohen's d", 'Mean']).set_index('index')
    return result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...