Pandas - Как сохранять частоты разных значений в разных столбцах построчно в CSV-файле (включая 0 частот) - PullRequest
0 голосов
/ 21 октября 2019

У меня есть CSV-файл со следующими интересующими столбцами

fields = ['column_0', 'column_1', 'column_2', 'column_3', 'column_4', 'column_5', 'column_6', 'column_7', 'column_8', 'column_9']

для каждого из этих столбцов есть 153 строки данных, содержащих только два значения: -1 или + 1

Моя проблема в том, что для каждого столбца я хотел бы сохранять частоты каждого значения -1 и +1 в стиле с разделением запятыми построчно в файле CSV. У меня возникают следующие проблемы, когда я делаю следующее:

>>>df = pd.read_csv('data.csv', skipinitialspace=True, usecols=fields)
>>>print df['column_2'].value_counts()
     1    148
    -1      5
>>>df['column_2'].value_counts().to_csv('result.txt', index=False )

Затем, когда я открываю results.txt, вот что я нашел

148

5

Что, очевидно, мне не нужно, я хочу, чтобы значения в той же строке текстового файла разделялись запятой (например, 148, 5).

Вторая проблемаУ меня бывает, когда одна из частот равна нулю,

>>> print df['column_9'].value_counts()
      1    153
>>> df['column_9'].value_counts().to_csv('result.txt', index=False )

Затем, когда я открываю results.txt, вот что я нашел

153

Я также не хочу такого поведения, я хотел бы видеть 153, 0

Итак, в заключение, я хотел бы знать, как это сделать с пандами

  1. Учитываяодин столбец, сохраните его различные значения частот в одной строке CSV-файла и разделите запятыми. Например:

148,5

Если есть значение с частотой 0, поместите его в CSV. Например:

153,0

Добавить эти значения частоты в разные строки одного и того же файла CSV. Например:

148,5

153,0

Могу ли я сделать это с пандами? или я должен перейти на другую библиотеку Python?

Ответы [ 3 ]

2 голосов
/ 21 октября 2019

Пример с некоторыми фиктивными данными:

import pandas as pd

df = pd.DataFrame({'col1': [1, 1, 1, -1, -1, -1],
                   'col2': [1, 1, 1, 1, 1, 1],
                   'col3': [-1, 1, -1, 1, -1, -1]})

counts = df.apply(pd.Series.value_counts).fillna(0).T

print(counts)

Вывод:

       -1    1
col1  3.0  3.0
col2  0.0  6.0
col3  4.0  2.0

Затем вы можете экспортировать это в csv.

См. Этот ответ для ссылки: Как получить значения для нескольких столбцов одновременно в Pandas DataFrame?

1 голос
/ 21 октября 2019

Вот пример с тремя столбцами c1, c2, c3 и фреймом данных d, который определен до вызова функции.

import pandas as pd
import collections

def wcsv(d):
    dc=[dict(collections.Counter(d[i]))  for i in d.columns]
    for i in dc:
        if -1 not in list(i.keys()):
          i[-1]=0
        if 1 not in list(i.keys()):
          i[1]=0

    w=pd.DataFrame([ list(j.values()) for j in dc],columns=['1','-1'],index=['c1','c2','c3'])
    w.to_csv("t.csv")

d=pd.DataFrame([[1,1,-1],[-1,1,1],[1,1,-1],[1,1,-1]],columns=['c1','c2','c3'])
wcsv(d)
1 голос
/ 21 октября 2019

Я полагаю, что вы могли бы делать то, что вы хотите, как это

import io
import pandas as pd

df = pd.DataFrame({'column_1': [1,-1,1], 'column_2': [1,1,1]})

with io.StringIO() as stream:
    # it's easier to transpose a dataframe so that the number of rows become columns
    # .to_frame to DataFrame and .T to transpose
    df['column_1'].value_counts().to_frame().T.to_csv(stream, index=False)

    print(stream.getvalue()) # check the csv data

Но я бы предложил что-то подобное, так как в противном случае вам пришлось бы указать, что одно из ожидаемых значений отсутствует

with io.StringIO() as stream:
    # it's easier to transpose a dataframe so that the number of rows become columns
    # .to_frame to DataFrame and .T to transpose
    counts = df[['column_1', 'column_2']].apply(lambda column: column.value_counts())
    counts = counts.fillna(0)
    counts.T.to_csv(stream, index=False)

    print(stream.getvalue()) # check the csv data

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