Значение не устанавливается в пандас-фрейм данных во время итерации - PullRequest
0 голосов
/ 09 октября 2018

У меня есть счетчик, который выглядит следующим образом:

Counter({'.java': 57,
         'python': 1159,
         'c++': 167,
         'c#': 20})

И такой кадр данных:

languages = ['java', 'python', 'c++', 'c#']
df = pd.DataFrame(index= languages, columns = ['count'])
df['count'] = df['count'].fillna(0)

Я хотел бы перебрать счетчик так, чтобы значения вобновление кадра данных:

for language in languages:
    df.loc[language, 'count'] = ctr[language]

Но я получаю 0 для значения во всем кадре данных:

        count
java    0
python  0
c++     0
c#      0

Это происходит, даже если я установил df.loc[language, 'count'] = 9 или любое другое число.

Почему это происходит?Именно так я всегда перебирал кадры данных и устанавливал значения.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Вы можете передать Counter в DataFrame.from_dict:

ctr = Counter({'java': 57,
         'python': 1159,
         'c++': 167,
         'c#': 20})

#pandas 0.23.0
df = pd.DataFrame.from_dict(ctr, orient='index', columns=['count'])

#lower versions of pandas
#df = pd.DataFrame.from_dict(ctr, orient='index')
#df.columns=['count']
print (df)

        count
java       57
python   1159
c++       167
c#         20

Если список languages имеет больше значений, как в Counter add reindex:

languages = ['java', 'python', 'c++', 'c#', 'perl']

df = df.reindex(languages, fill_value=0)
print (df)
        count
java       57
python   1159
c++       167
c#         20
perl        0
0 голосов
/ 09 октября 2018

Это самый неловкий ответ, который мне приходилось публиковать на свой вопрос, и хотя я как бы хотел, чтобы SO позволил мне удалить все это (не будет теперь, когда другие ответили), другую частья рад, что это заставляет меня а) испытывать стыд и б) публиковать ответ, который, на мой взгляд, полезен для написания чистого кода.

В своем вопросе я использовал поддельную переменную df, чтобы придерживаться стандарта и скрывать имена, которые я использовал.Итак, мой вопрос выглядел так:

languages = ['java', 'python', 'c++', 'c#']
df = pd.DataFrame(index= languages, columns = ['count'])
df['count'] = df['count'].fillna(0)

for language in languages:
    df.loc[language, 'count'] = ctr[language]

Но то, что на самом деле происходило в моей записной книжке, выглядело так:

languages = ['java', 'python', 'c++', 'c#']
jobs_count_df = pd.DataFrame(index= languages, columns = ['count'])
jobs_count_df['count'] = jobs_count_df['count'].fillna(0)

for language in languages:
    jobs_df.loc[language, 'count'] = 1

Теперь, когда солнце вышло, и я не борюсь со сном,Нетрудно понять, в чем проблема.Но в затуманенном вечернем сеансе (не редкая среда для кодирования) я упустил из виду, что перебираю другую, но тупо , с аналогичным именем переменную .Я чувствую, что обычно, особенно среди таких, как я, которые не слишком опытны, пишут неаккуратные имена переменных (df, df2 и т. Д.), Которые почти просят подобных ошибок.Я усвоил свой урок трудным путем (то есть, смутив себя).

Спасибо тем, кто написал ответы.Вы проголосовали за борьбу с моим идиотизмом.

0 голосов
/ 09 октября 2018

Обычно это должно работать, если нет необходимости конвертировать счетчик в словарь.тогда это сработает.

languages = ['java', 'python', 'c++', 'c#']
df = pd.DataFrame(index= languages, columns = ['count'])
df['count'] = df['count'].fillna(0)
dctr = dict(ctr)
dctr = {'java': 57,
         'python': 1159,
         'c++': 167,
         'c#': 20}
for language in languages:
    df.loc[language, 'count'] = dctr[language]

print(df)


        count
java       57
python   1159
c++       167
c#         20

PS: Над @jezrael ответ - это то, что вы ищете.

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