使用pandas python

时间:2018-09-04 05:38:28

标签: python pandas

我具有以下数据结构:

      speed            frequency_count
      900.0                5
      902.0                1
      905.0                8
      906.0                1
      910.0               15
      911.0                1
      914.0                1
      915.0               45
      916.0                4

最初,此数据为2个列表,我尝试循环并创建新字典,但失败了。我的预期结果是,该结果也可能是字典。真的没关系。

      speed            frequency_count          range              sum_freq
      900.0                5                   900-950                15
      902.0                1                   900-950                15
      905.0                8                   900-950                15
      956.0                1                   900-950                15
      960.0               15                   950-1000               17
      981.0                1                   950-1000               17
      944.0                1                   950-1000               17

如果数据为列表格式:

   x_list = [900.0, 902.0, 905.0, 906.0, 950.0, 951.0, 954.0, 955.0, 986.0, 987.0]

   y_list= [5, 1, 8, 1, 15, 1, 1, 45, 4, 5]

如何转换为范围字典或2个groupums列表?实际上,我非常想尝试学习不同的格式操作,而不是熊猫。

2 个答案:

答案 0 :(得分:7)

cutGroupBy.transform一起使用:

df['range'] = pd.cut(df['speed'], 
                     bins=[900,950,1000], 
                     labels=['900-950','950-1000'], 
                     include_lowest=True)
df['sum_freq'] = df.groupby('range')['frequency_count'].transform('sum')
print (df)
   speed  frequency_count     range  sum_freq
0  900.0                5   900-950        15
1  902.0                1   900-950        15
2  905.0                8   900-950        15
3  956.0                1  950-1000        17
4  960.0               15  950-1000        17
5  981.0                1  950-1000        17
6  944.0                1   900-950        15

带有垃圾箱标签的更多动态解决方案:

x_list = [900.0, 902.0, 905.0, 906.0, 950.0, 951.0, 954.0, 955.0, 986.0, 987.0]
y_list= [5, 1, 8, 1, 15, 1, 1, 45, 4, 5]
df = pd.DataFrame({'speed':x_list, 'frequency_count':y_list})

bins = [900,950,1000]
labels = ['{}-{}'.format(i + 1, j) for i, j in zip(bins[:-1], bins[1:])] 
labels[0] = '{}-{}'.format(bins[0], bins[1])

df['range'] = pd.cut(df['speed'], bins=bins, labels=labels, include_lowest=True)
df['sum_freq'] = df.groupby('range')['frequency_count'].transform('sum')
print (df)
   speed  frequency_count     range  sum_freq
0  900.0                5   900-950        30
1  902.0                1   900-950        30
2  905.0                8   900-950        30
3  906.0                1   900-950        30
4  950.0               15   900-950        30
5  951.0                1  951-1000        56
6  954.0                1  951-1000        56
7  955.0               45  951-1000        56
8  986.0                4  951-1000        56
9  987.0                5  951-1000        56

答案 1 :(得分:0)

第二部分与@jezrael的相同,但第一部分不同。

但是无论如何,

使用pandas.DataFrame.apply + pandas.DataFrame.transform

df['range'] = df['speed'].apply(lambda x: '900-950' if x in range(900,950) else '950-1000')
df['sum_freq'] = df.groupby('range')['frequency_count'].transform(sum)
print(df)

输出:

   speed  frequency_count     range  sum_freq
0  900.0                5   900-950        15
1  902.0                1   900-950        15
2  905.0                8   900-950        15
3  956.0                1  950-1000        17
4  960.0               15  950-1000        17
5  981.0                1  950-1000        17
6  944.0                1   900-950        15