小编SoH*_*Hei的帖子

在Pandas数据帧中提取嵌入为字符串的嵌套JSON

我有一个CSV,其中一个字段是嵌套的JSON对象,存储为字符串.我想将CSV加载到数据帧中,并将JSON解析为附加到原始数据帧的一组字段; 换句话说,提取JSON的内容并使它们成为数据帧的一部分.

我的CSV:

id|dist|json_request
1|67|{"loc":{"lat":45.7, "lon":38.9},"arrival": "Monday", "characteristics":{"body":{"color":"red", "make":"sedan"}, "manuf_year":2014}}
2|34|{"loc":{"lat":46.89, "lon":36.7},"arrival": "Tuesday", "characteristics":{"body":{"color":"blue", "make":"sedan"}, "manuf_year":2014}}
3|98|{"loc":{"lat":45.70, "lon":31.0}, "characteristics":{"body":{"color":"yellow"}, "manuf_year":2010}}
Run Code Online (Sandbox Code Playgroud)

请注意,并非所有行的所有键都相同.我希望它能产生一个与此相当的数据框:

data = {'id'     : [1, 2, 3],
        'dist'  : [67, 34, 98],
        'loc_lat': [45.7, 46.89, 45.70],
        'loc_lon': [38.9, 36.7, 31.0],
        'arrival': ["Monday", "Tuesday", "NA"],
        'characteristics_body_color':["red", "blue", "yellow"],
        'characteristics_body_make':["sedan", "sedan", "NA"],
        'characteristics_manuf_year':[2014, 2014, 2010]}
df = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

(我很抱歉,我不能让桌子本身看起来很明智!请不要生我的气,我是菜鸟:()

我试过的

在经历了很多困难之后,我提出了以下解决方案:

#Import data
df_raw = pd.read_csv("sample.csv", delimiter="|")

#Parsing function
def parse_request(s):
    sj = json.loads(s)
    norm = json_normalize(sj)
    return norm

#Create an …
Run Code Online (Sandbox Code Playgroud)

python csv json

9
推荐指数
1
解决办法
6133
查看次数

PySpark将字典的字符串化数组分解为行

我有一个带有StringType列(edges)的pyspark数据框,其中包含字典列表(请参见下面的示例)。字典包含多种值类型,包括另一个字典(nodeIDs)。我需要将edges字段中的顶级词典分解为几行;理想情况下,我应该能够将其组件值转换为单独的字段。

输入:

import findspark
findspark.init()

SPARK = SparkSession.builder.enableHiveSupport() \
                    .getOrCreate()

data = [
    Row(trace_uuid='aaaa', timestamp='2019-05-20T10:36:33+02:00', edges='[{"distance":4.382441320292239,"duration":1.5,"speed":2.9,"nodeIDs":{"nodeA":954752475,"nodeB":1665827480}},{"distance":14.48582171131768,"duration":2.6,"speed":5.6,"nodeIDs":{"nodeA":1665827480,"nodeB":3559056131}}]', count=156, level=36),
    Row(trace_uuid='bbbb', timestamp='2019-05-20T11:36:10+03:00', edges='[{"distance":0,"duration":0,"speed":0,"nodeIDs":{"nodeA":520686131,"nodeB":520686216}},{"distance":8.654358326561642,"duration":3.1,"speed":2.8,"nodeIDs":{"nodeA":520686216,"nodeB":506361795}}]', count=179, level=258)
    ]

df = SPARK.createDataFrame(data)

Run Code Online (Sandbox Code Playgroud)

所需的输出:

    data_reshaped = [
        Row(trace_uuid='aaaa', timestamp='2019-05-20T10=36=33+02=00', distance=4.382441320292239, duration=1.5, speed=2.9, nodeA=954752475, nodeB=1665827480, count=156, level=36),
        Row(trace_uuid='aaaa', timestamp='2019-05-20T10=36=33+02=00', distance=16.134844841712574, duration=2.9,speed=5.6, nodeA=1665827480, nodeB=3559056131, count=156, level=36),
        Row(trace_uuid='bbbb', timestamp='2019-05-20T11=36=10+03=00', distance=0, duration=0, speed=0, nodeA=520686131, nodeB=520686216, count=179, level=258),
        Row(trace_uuid='bbbb', timestamp='2019-05-20T11=36=10+03=00', distance=8.654358326561642, duration=3.1, speed=2.8, nodeA=520686216, nodeB=506361795, count=179, level=258)
       ]
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?我尝试过使用castedges字段首先将其转换为数组,但无法弄清楚如何使其与混合数据类型一起使用。

我正在使用Spark 2.4.0。

python dataframe apache-spark apache-spark-sql pyspark

4
推荐指数
1
解决办法
327
查看次数

如何在Python中找到周日开始的周数?

Python的新手,如果这很明显,请提前道歉.我有一些日期时间值,我想为其确定年份和周数,例如:

start_date = datetime.datetime(2015,1,26,0,0,0)
Run Code Online (Sandbox Code Playgroud)

问题是,我希望将这一周定义为星期日开始.

我知道datetime.isocalendar()可以获得周数,但是它们将在周一开始的几周开始计算.还有其他方法吗?

编辑:运行Python 2.7.6

谢谢!

python datetime

2
推荐指数
1
解决办法
2404
查看次数