упростить разбиение информационного кадра на несколько информационных - PullRequest
0 голосов
/ 12 марта 2020

Итак, у меня есть несколько фреймов данных ( df0 , df1 , df2 ) с различным количеством строк. Я хотел разделить любой фрейм данных, имеющий количество строк более 30, на несколько фреймов данных, состоящих только из 30 строк. Так, например, мой фрейм данных df0 имеет 156 строк, тогда я бы разделил этот фрейм данных на несколько фреймов, например:

if len(df0) > 30:
        df0_A = df0[0:30]
        df0_B = df0[31:60]
        df0_C = df0[61:90]
        df0_D = df0[91:120]
        df0_E = df0[121:150]
        df0_F = df0[151:180]
    else:
        df0= df0

Проблема с этим кодом заключается в том, что мне нужно повторить код много раз для следующего кода, подобного этому:

df0= pd.DataFrame(df0)
df0_A = pd.DataFrame(df0_A)
df0_B = pd.DataFrame(df0_B)
df0_C = pd.DataFrame(df0_C)
df0_D = pd.DataFrame(df0_D)
df0_E = pd.DataFrame(df0_E)
df0_F = pd.DataFrame(df0_F)

df0= df0.to_string(header=False,
                              index=False,
                              index_names=False).split('\n')
df0_A = df0_A.to_string(header=False,
                              index=False,
                              index_names=False).split('\n')
df0_B = df0_B.to_string(header=False,
                              index=False,
                              index_names=False).split('\n')
df0_C = df0_C.to_string(header=False,
                              index=False,
                              index_names=False).split('\n')
df0_D = df0_D.to_string(header=False,
                              index=False,
                              index_names=False).split('\n')
df0_E = df0_E.to_string(header=False,
                              index=False,
                              index_names=False).split('\n')
df0_F = idUGS0_F.to_string(header=False,
                              index=False,
                              index_names=False).split('\n')

df0= [','.join(ele.split()) for ele in df0]
df0_A = [','.join(ele.split()) for ele in df0_A]
df0_B = [','.join(ele.split()) for ele in df0_B]
df0_C = [','.join(ele.split()) for ele in df0_C]
df0_D = [','.join(ele.split()) for ele in df0_D]
df0_E = [','.join(ele.split()) for ele in df0_E]
df0_F = [','.join(ele.split()) for ele in df0_F]

теперь представьте, что у меня есть десять фреймов данных, которые мне нужно разделить каждый на пять фреймов данных. Тогда мне нужно сделать один и тот же код 50 раз! Я совершенно новичок в Python. Итак, кто-нибудь может мне помочь с тем, как упростить этот код, может быть, с простым для l oop? спасибо

Ответы [ 3 ]

1 голос
/ 12 марта 2020

Это большая проблема, вы можете использовать это (данные - это DataFrame здесь):

# Create subsets of size 30 for the DataFrame
subsets = list(range(0, len(data), 30))

# Create start cutoffs for subsets of the DataFrame
start_cutoff = subsets

# Create end cutoffs for subsets of the DataFrame
end_cutoff = subsets[1:] +  [len(data)]

# Zip the start cutoffs and end cutoffs into a List of Cutoffs
cutoffs = list(zip(start_cutoff, end_cutoff))

# List containing Splitted Dataframes
list_dfs = [data.iloc[cutoff[0]: cutoff[-1]] for cutoff in cutoffs]

# convert list to string DFs
string_dfs = [df.to_string(header=False, index=False, index_names=False).split('\n') for df in list_dfs]

final_df_list = [','.join(ele.split()) for string_df in string_dfs for ele in string_df]

Теперь вы можете получить доступ к DataFrames:

 print(final_df_list[0])
 print(final_df_list[1])
1 голос
/ 12 марта 2020

Возможно, вы могли бы автоматизировать это немного больше, но этого должно быть достаточно!

import copy
import numpy as np
df0 = pd.DataFrame({'Test' : np.random.randint(100000,999999,size=180)})
len(df0)
if len(df0) > 30:
    df_dict = {}
    x=0
    y=30
    for df_letter in ['A','B','C','D','E','F']:
        df_name = f'df0_{df_letter}'    
        df_dict[df_name] = copy.deepcopy(df_letter)
        df_dict[df_name] = pd.DataFrame(df0[x:y]).to_string(header=False, index=False, index_names=False).split('\n ')
        df_dict[df_name] = [','.join(ele.split()) for ele in df_dict[df_name]]
        x += 30
        y += 30
    df_name
else:
    df0
for df in df_dict:
    print(df)
    print('--------------------------------------------------------------------')
    print(f'length: {len(df_dict[df])}')
    print('--------------------------------------------------------------------')
    print(df_dict[df])
    print('--------------------------------------------------------------------')
1 голос
/ 12 марта 2020

Если у вас есть один столбец для идентификации ,

def split_df(idf, idcol, nsize):
  g = idf.groupby(idcol)
  # Compute the size for each value of identification column
  size = g.size()

  dflist = []
  for _id,_idcount in size.iteritems():
    if _idcount > nsize:
      # print(_id, ' = ', _idcount)
      idx     = idf[ idf[idcol].eq(_id) ].index
      # print(idx)
      # lets split the array into equal parts of `nsize`
      # e.g. [1,2,3,4,5] with nsize = 2 will split into ([1,2], [3,4], [5])
      ilist   = np.array_split(idx, round(idx.shape[0]/nsize + 0.5))
      dflist += ilist

  return [idf.loc[idx].copy(deep=True) for idx in dflist]

df = pd.DataFrame(data=np.hstack((np.random.choice(np.arange(1,3), 10).reshape(10, -1), np.random.rand(10,3))), columns=['id', 'a', 'b', 'c'])

df = df.astype({'id': np.int64})

split(df, 'id', 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...