如何通过列值的范围将单个数据帧拆分为多个数据帧?

时间:2019-08-26 13:23:37

标签: python python-3.x pandas

首先,我意识到这个问题已经以许多不同的形式被问过很多次,但是很多答案只是给出了解决问题的代码,而没有解释代码的实际作用或工作原理。

我有大量的电话号码和区号数据集,已将它们加载到python的数据框中以进行一些处理。在执行该处理之前,我需要将单个数据框拆分为多个包含某些区域代码电话号码的数据框,然后可以对其进行更多处理。例如:

+---+--------------+-----------+
|   | phone_number | area_code |
+---+--------------+-----------+
| 1 | 5501231234   | 550       |
+---+--------------+-----------+
| 2 | 5051231234   | 505       |
+---+--------------+-----------+
| 3 | 5001231234   | 500       |
+---+--------------+-----------+
| 4 | 6201231234   | 620       |
+---+--------------+-----------+

进入

area-codes (500-550)
+---+--------------+-----------+
|   | phone_number | area_code |
+---+--------------+-----------+
| 1 | 5501231234   | 550       |
+---+--------------+-----------+
| 2 | 5051231234   | 505       |
+---+--------------+-----------+
| 3 | 5001231234   | 500       |
+---+--------------+-----------+

area-codes (600-650)
+---+--------------+-----------+
|   | phone_number | area_code |
+---+--------------+-----------+
| 1 | 6201231234   | 620       |
+---+--------------+-----------+

我认为使用pandas(特别是groupby和一个Series对象)应该可以实现,但是我可以在互联网上找到的文档和示例太模糊或稀疏,以至于我无法遵循。也许有比我尝试的方法更好的方法了?

2 个答案:

答案 0 :(得分:2)

您可以使用pd.cutdef drop_first_last(grades): return avg(grades[1:-1]) # slicing to ignore the first and last elements in the list 列中的bin,然后使用标签对数据进行分组并存储在字典中。最后打印每个键以查看数据框:

area

bins=[500,550,600,650]
labels=['500-550','550-600','600-650']

d={f'area_code_{i}':g for i,g in 
  df.groupby(pd.cut(df.area_code,bins,include_lowest=True,labels=labels))}

print(d['area_code_500-550'])
print('\n')
print(d['area_code_600-650'])

答案 1 :(得分:0)

您还可以通过使用&|运算符链接多个条件来选择数据框中的行来完成此操作

  • df1选择Area_code在500-550之间的行

  • df2选择区域代码在600-650之间的行


df = pd.DataFrame({'phone_number':[5501231234, 5051231234, 5001231234 ,6201231234],
                   'area_code':[550,505,500,620]}, 
                    columns=['phone_number', 'area_code'])
df1 = df[ (df['area_code']>=500) & (df['area_code']<=550) ]
df2 = df[ (df['area_code']>=600) & (df['area_code']<=650) ]

df1
phone_number  area_code
0    5501231234        550
1    5051231234        505
2    5001231234        500

df2
phone_number  area_code
3    6201231234        620