Вот быстрый способ настроить DataFrame
:
import pandas as pd
import numpy as np
data = [
[False, "bird", ""],
[True, "fish", ""],
[True, "Tiger", ""],
[False, "Elephant", ""],
]
df = pd.DataFrame(data=data, columns=["A", "B", "C"])
Это создает переменную df
, содержащую DataFrame
в Pandas
.
Теперь используйте этот код для итерации по DataFrame
и установите каждое значение:
last = []
for index, row in df.iterrows():
if index == 0:
df.at[index, 'C'] = row['B'] # because first one has no previous to concatenate to
else:
if (row['A']): # check A
df.at[index, 'C'] = last['C']+','+row['B'] # if A is true, then concatenate previous B and this one
else:
df.at[index, 'C'] = row['B'] # else, use this B
last = row # now set this row to the last one that was accessed, for the next iteration of this loop
Если вы print(pd)
в этот момент, вы получите ожидаемый результат.
Вот полный код, который я использовал:
import pandas as pd
import numpy as np
data = [
[False, "bird", ""],
[True, "fish", ""],
[True, "Tiger", ""],
[False, "Elephant", ""],
]
df = pd.DataFrame(data=data, columns=["A", "B", "C"])
print(df)
last = []
for index, row in df.iterrows():
if index == 0:
df.at[index, 'C'] = row['B'] # because first one has no previous to concatenate to
else:
if (row['A']): # check A
df.at[index, 'C'] = last['B']+','+row['B']
else:
df.at[index, 'C'] = row['B']
last = row
print(df)
Если команда, которая работает над кодом, знает то, что версия Linq делает и знает свои внутренние работы, то это более читаемо.
Второй, определенно. Наличие такого большого блока кода для того, чтобы сделать что-то столь простое, как подведение итогов является просто ненужным. Я также не знаю, каков LINQ, но это совершенно читаемо мне.
Я думаю, что это зависит от того, под чем Вы подразумеваете "читаемый". Первый пример ясно указывает на логику программы и должен быть понятным любым с фоном программирования.
Мне второй пример более интуитивен на основе контекста (т.е. Вы берете массив (или некоторый другой тип набора) и выполняете метод под названием Сумма на каждом элементе того массива). Единственное место второй пример может стать менее ясным, находится в самом фактическом лямбда-выражении специально для кого-то, кто не имел опыта с лямбдами или уже имеет знания в функциональном программировании.
Я думаю, поскольку лямбды становятся более распространенными в.NET, программируя это, станет меньшим количеством проблемы. В настоящий момент я думаю, что существует очень небольшая кривая обучения к пониманию основ того, как использовать лямбда-выражения в.NET.
Я соглашаюсь с теми, кто говорит, что второе будет понятно, поскольку Linq становится более широко принятым. Это, конечно, более сжато.
Однако у меня есть некоторая озабоченность по поводу простоты отладки. Кажется намного легче ступить через код в foreach, видеть точно, что это делает в каждой передаче.
Если Ваша цель состоит в том, чтобы сделать это более читаемым для "кого-либо", который мог бы приехать после Вас, затем использовать foreach. Я интерпретирую "более читаемый", чтобы означать, что любой с опытом в основах языка должен смочь схватить. Для кого-то незнакомого с linq и все еще использующий VS2005 или ранее, linq синтаксис сбивал бы с толку.
Я сказал бы, что первая часть кода определенно более читаема, и это было бы еще более читаемо при переименовании, по крайней мере, переменного риска так, чтобы это имело другое имя от класса. Вероятно, также было бы лучше при переименовании рисков массива.
Я вижу, что люди говорят, что им нравится первый, "если Вы не знаете Linq". Да, и первый нечитабелен, если Вы не знаете C#. Это не вопрос, "который более читаем", но, "какие функции языка - мы удобное использование?"
Запустите путем разговора с командой о частях языка/платформы/набора инструментов, который все ненавидят, и объявите их от пределов. Все остальное считают частью стандартного словаря, и все, как ожидают, будут быстры. Этот список должен войти в Ваш документ стандартов кодирования, прямо рядом с "никогда не делают изменяемые типы значения", и "не беспокоятся тривиальными свойствами для непубличных участников".
Пока Linq не находится на Вашем "исключать" список, второй пример намного более читаем, чем первое. Почему? Поскольку это объявляет намерение кода, вместо того, чтобы просто представить механизм для читателя для дешифровки.
или
десятичное число technicalPremium = 0;
foreach (Риск риска в рисках) technicalPremium = technicalPremium + риск. TechnicalPremium;
возвратите technicalPremium;
Каждый язык имеет конвенции для лучшего способа кодировать такие вещи, поэтому что является самым читаемым людям, которые регулярно используют тот язык, не универсально. Для Java или нормального программиста C#, первая опция более читаема. Для кого-то привыкшего к LINQ или функциональному программированию, второе более читаемо.
Я не знаю c#, но вторая альтернатива выглядит намного более чистой мне, и я мог понять то, что это делает (хорошо с некоторым предположением и перепроверкой с первой версией). Probabably из-за некоторого функционального фона. Но в первом необходимо искать technicalPremium в 4(!) местах. Второй намного короче и легче понять, перечитываете ли Вы просто по коду.
Здесь нет никакой проблемы удобочитаемости. Нажмите на Sum и поразите F1.
Linq для победы.
Если бы Вы предоставляете комментарий, объясняя, что это - цель, то я пошел бы для опции Linq.
Я сказал бы, что первое, так как я не знаю linq. Из-за опасности по документированию я использовал бы то с кратким описанием того, что продолжается. Или просто скажите, что это - linq для людей, которые могут понятия не иметь.
Первая опция более читаема к более широкому диапазону людей. Вторая опция имеет 'барьер записи', в котором читатель мог бы или мог бы знать и понять LINQ. Это более сжато, и могло бы быть поэтому лучше, если Ваша аудитория по тому барьеру записи.
Пойдите с linq. Если Вы будете думать, что этому нужно объяснение, то один комментарий строки будет заботиться об этом. Поскольку люди становятся более привыкшими к linq, потребность в комментариях уйдет.
Я думаю, что второй вариант лучше в этом, это должно быть более эффективно. Однако, менее очевидно, что происходит (по крайней мере, со мной).
Для кого-то, кто может считать LINQ, LINQ один.
Для кого-то, кто должен интерпретировать код шаг за шагом (при помощи intellisense/documentation более короткий.
Ни один. Первый является более подробным и вероятным быть понятым под всеми. Второй более краток и понятен всем даже с передающим знанием linq.
Я сказал бы, что можно основывать выбор на среде, в которой Вы находитесь.
Используйте, какой бы ни Вы предпочитаете, но скрываете его в методе:
return risks.SumTechnicalPremium();
Первое, если Вы не знаете о Linq. Любой разработчик может считать и понять первого.