Разделение DataFrame на 2 на основе значения столбца - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть набор данных, который я пытаюсь разделить на 2 меньших кадра данных, называемых test и train. Исходный набор данных имеет два столбца «Patient_NBR» и «встречи_ID». Все эти столбцы имеют значения 6 di git.

Как я могу go через этот фрейм данных и сложить все цифры в этих двух столбцах. Например, если в первой строке кадра данных значения 123456 и 123456, мне нужно добавить 1 + 2 + 3 + 4 + 5 + 6 + 1 + 2 + 3 + 4 + 5 + 6. Сумма используется, чтобы определить, идет ли этот ряд в тест или поезд. Если это даже, проверить. Если это странно, тренируйтесь.

Ниже я попробовал ниже. Но это так медленно. Я превратил два нужных мне столбца в два numpy массива, чтобы разбить и сложить цифры. Я добавил эти numpy массивы, чтобы получить один, и перебрал его, чтобы определить, какой именно фрейм данных должен go in.

with ZipFile('dataset_diabetes.zip') as zf:
    with zf.open('dataset_diabetes/diabetic_data.csv','r') as f:
        df = pd.read_csv(f)

nums1 = []
nums2 = []

encounters = df["encounter_id"].values
for i in range(len(encounters)):
    result = 0
    while encounters[i] > 0:
        rem = encounters[i] % 10
        result = result + rem
        encounters[i] = int(encounters[i]/10)
    nums1.append(result)

patients = df["patient_nbr"].values
for i in range(len(patients)):
    result = 0
    while patients[i] > 0:
        rem = patients[i] % 10
        result = result + rem
        patients[i] = int(patients[i]/10)
    nums2.append(result)

nums = np.asarray(nums1) + np.asarray(nums2)
df["num"] = nums

# nums = df["num"].values

train = pd.DataFrame()
test = pd.DataFrame()

for i in range(len(nums)):
    if int(nums[i] % 2) == 0:
        # goes to train
        train.append(df.iloc[i])
    else:
        # goes to test
        test.append(df.iloc[i])

1 Ответ

0 голосов
/ 30 апреля 2020

Вы можете сделать это, играя с astype до go с int до str до float, sum в обоих столбцах строки подряд (например, объединить обе строки), затем str.split и разверните строку, и sum снова для каждой строки после выбора правильных столбцов и измените тип каждого di git как float.

#dummy example
df = pd.DataFrame({'patient_nbr':[123456, 123457, 123458],
                   'encounter_id':[123456, 123456, 123457]})

#create num
df['num'] = df[['patient_nbr', 'encounter_id']].astype(str).sum(axis=1)\
              .astype(str).str.split('', expand=True)\
              .loc[:,1:12].astype(float).sum(axis=1)

print (df)
   patient_nbr  encounter_id   num
0       123456        123456  42.0
1       123457        123456  43.0
2       123458        123457  45.0

, а затем используйте этот столбец для создания маски с четным как Ложь и нечетный, как Истина

mask = (df['num']%2).astype(bool)
train = df.loc[~mask, :] #train is the even
test = df.loc[mask, :] #test is the odd
print (test)
   patient_nbr  encounter_id   num
1       123457        123456  43.0
2       123458        123457  45.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...