Разработайте распределение частоты, обобщив эти данные. Эти данные являются спросом на объект в течение 20 дней.

2 1 0 2 1 3 0 2 4 0 3 2 3 4 2 2 2 4 3 0. Задача состоит в том, чтобы создать таблицу в блокноте jupyter с колонками «Спрос и частота». Примечание: спрос должен быть в порядке возрастания. Это то, что я сделал.

list_of_days = [2, 1, 0, 2, 1, 3, 0, 2, 4, 0, 3, 2 ,3, 4, 2, 2, 2, 4, 3, 0] # created a list of the data
import pandas as pd
series_of_days = pd.Series(list_of_days) # converted the list to series
series_of_days.value_counts(ascending = True) # the frequency was ascending but not the demand
test = dict(series_of_days.value_counts())
freq_table =  pd.Series(test)
pd.DataFrame({"Demand":freq_table.index, "Frequency":freq_table.values})

Вывод должен быть таким:

<table border = "1">

  <tr>
    <td>Demand</td>
    <td>Frequency</td>
  </tr>
  <tr>
    <td>0</td>
    <td>4</td>
  </tr>
  <tr>
    <td>1</td>
    <td>2</td>
  </tr>
  <tr>
    <td>2</td>
    <td>7</td>
  </tr>
<table>

И так далее. Есть ли лучший способ сократить код Python? Или сделать это более эффективным?

-1
Mainul Islam 9 Янв 2017 в 18:45

4 ответа

Лучший ответ

Вы можете использовать value_counts с reset_index и сортировкой sort_values:

df1 = pd.Series(list_of_days).value_counts()
        .reset_index()
        .sort_values('index')
        .reset_index(drop=True)
df1.columns = ['Demand', 'Frequency']
print (df1)
   Demand  Frequency
0       0          4
1       1          2
2       2          7
3       3          4
4       4          3

Другое похожее решение с сортировкой по sort_index :

df1 = pd.Series(list_of_days)
        .value_counts()
        .sort_index()
        .reset_index()
        .reset_index(drop=True)
df1.columns = ['Demand', 'Frequency']
print (df1)
   Demand  Frequency
0       0          4
1       1          2
2       2          7
3       3          4
4       4          3
4
jezrael 9 Янв 2017 в 15:53
import collections
collections.Counter(list_of_days)

Должен делать то, что вы описываете

1
Mohammad Athar 9 Янв 2017 в 15:48

Я собираюсь буквально создать HTML-таблицу, которую вы разместили

pd.value_counts([2,1,0,2,1,3,0,2,4,0,3,2,3,4,2,2,2,4,3,0]).to_frame(name='Frequency').rename_axis('Demand', 1).sort_index()

enter image description here

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th>Demand</th>
      <th>Frequency</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>4</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
    </tr>
    <tr>
      <th>2</th>
      <td>7</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
    </tr>
    <tr>
      <th>4</th>
      <td>3</td>
    </tr>
  </tbody>
</table>
1
piRSquared 9 Янв 2017 в 15:58

Если вы хотите кратчайший, возможно, этот код, Counter по умолчанию отсортирует ключ по возрастанию.

list_of_days = [2, 1, 0, 2, 1, 3, 0, 2, 4, 0, 3, 2, 3, 4, 2, 2, 2, 4, 3, 0]  
day_counter = Counter(list_of_days).items()
data = [ [a,b] for a,b in day_counter ]
print(data)

[[0, 4], [1, 2], [2, 7], [3, 4], [4, 3]]

0
Po Stevanus Andrianta 9 Янв 2017 в 16:06