小编cph*_*sto的帖子

在 spark 中为日期填充缺失值的优雅方法

让我把这个问题分解成一个更小的部分。我在PySpark,在那里我有一列中的数据帧arrival_datedate格式-

from pyspark.sql.functions import to_date
values = [('22.05.2016',),('13.07.2010',),('15.09.2012',),(None,)]
df = sqlContext.createDataFrame(values,['arrival_date'])

#Following code line converts String into Date format
df = df.withColumn('arrival_date',to_date(col('arrival_date'),'dd.MM.yyyy'))
df.show()
+------------+
|arrival_date|
+------------+
|  2016-05-22|
|  2010-07-13|
|  2012-09-15|
|        null|
+------------+

df.printSchema()
root
 |-- arrival_date: date (nullable = true)
Run Code Online (Sandbox Code Playgroud)

应用了很多转换到数据帧后,我终于想填充缺少的日期,标记为null01-01-1900

执行此操作的一种方法是将列转换arrival_dateString,然后以这种方式替换缺失值 -df.fillna('1900-01-01',subset=['arrival_date'])最后重新转换此列to_date。这是非常不雅观的。

下面的代码行不起作用,正如预期的那样,我收到一个错误 -

df = df.fillna(to_date(lit('1900-01-01'),'yyyy-MM-dd'), subset=['arrival_date'])
Run Code Online (Sandbox Code Playgroud)

文档说值必须是以下类型:Int、Long、Float、Double、String、Boolean。

另一种方法是使用withColumn()when()-

df = …
Run Code Online (Sandbox Code Playgroud)

python date apache-spark fillna

5
推荐指数
1
解决办法
4241
查看次数

在 Spark 中加入多个表的有效方法 - 设备上没有剩余空间

这里也有人问类似的问题,但它没有正确解决我的问题。我有近 100 个数据帧,每个数据帧至少有200,000行,我需要通过full基于列进行连接来加入它们ID,从而创建一个带有列的数据帧 - ID, Col1, Col2,Col3,Col4, Col5..., Col102

只是为了说明,我的 DataFrames 的结构 -

df1 =                          df2 =            df3 =          .....  df100 = 
+----+------+------+------+    +----+------+    +----+------+         +----+------+ 
|  ID|  Col1|  Col2|  Col3|    |  ID|  Col4|    |  ID|  Col5|         |  ID|Col102|
+----+------+-------------+    +----+------+    +----+------+         +----+------+
| 501|  25.1|  34.9| 436.9|    | 501| 22.33|    | 503| 22.33|         | 501|  78,1|
| 502|  12.2|3225.9|  46.2|    | 502| 645.1|    | 505| 645.1|         | 502|  54.9| …
Run Code Online (Sandbox Code Playgroud)

hadoop-partitioning apache-spark pyspark

5
推荐指数
1
解决办法
7071
查看次数

PySpark 一次替换多列中的值

我想用另一个值替换数据框列中的一个值,并且我必须为许多列(假设为 30/100 列)执行此操作

我已经经历了这个这个

from pyspark.sql.functions import when, lit, col

df = sc.parallelize([(1, "foo", "val"), (2, "bar", "baz"), (3, "baz", "buz")]).toDF(["x", "y", "z"])
df.show()

# I can replace "baz" with Null separaely in column y and z
def replace(column, value):
    return when(column != value, column).otherwise(lit(None))

df = df.withColumn("y", replace(col("y"), "baz"))\
    .withColumn("z", replace(col("z"), "baz"))
df.show()    
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我可以在 y 和 z 列中分别用 Null 替换“baz”。但我想对所有列都这样做 - 类似于下面的列表理解方式

[replace(df[col], "baz") for col in df.columns]
Run Code Online (Sandbox Code Playgroud)

python list-comprehension replaceall dataframe pyspark

5
推荐指数
1
解决办法
3257
查看次数

在Spark版本2.2中使用row_number()函数在PySpark DataFrame中创建每行的行号

我有一个PySpark DataFrame-

valuesCol = [('Sweden',31),('Norway',62),('Iceland',13),('Finland',24),('Denmark',52)]
df = sqlContext.createDataFrame(valuesCol,['name','id'])
+-------+---+
|   name| id|
+-------+---+
| Sweden| 31|
| Norway| 62|
|Iceland| 13|
|Finland| 24|
|Denmark| 52|
+-------+---+
Run Code Online (Sandbox Code Playgroud)

我希望在此DataFrame中添加一行列,这是该行的行号(序列号),如下所示-

我的最终输出应该是:

+-------+---+--------+
|   name| id|row_num |
+-------+---+--------+
| Sweden| 31|       1|
| Norway| 62|       2|
|Iceland| 13|       3|
|Finland| 24|       4|
|Denmark| 52|       5|
+-------+---+--------+
Run Code Online (Sandbox Code Playgroud)

我的Spark版本是 2.2

我正在尝试此代码,但无法正常工作-

from pyspark.sql.functions import row_number
from pyspark.sql.window import Window
w = Window().orderBy()
df = df.withColumn("row_num", row_number().over(w))
df.show()
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

AnalysisException: 'Window function row_number() requires window to be …
Run Code Online (Sandbox Code Playgroud)

row-number dataframe pandas apache-spark pyspark

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

删除PySpark数据框列中的最后几个字符

我有一个PySpark DataFrame。如何从name下面的栏中删除/删除最后5个字符-

from pyspark.sql.functions import substring, length
valuesCol = [('rose_2012',),('jasmine_2013',),('lily_2014',),('daffodil_2017',),('sunflower_2016',)]
df = sqlContext.createDataFrame(valuesCol,['name'])
df.show()

+--------------+
|          name|
+--------------+
|     rose_2012|
|  jasmine_2013|
|     lily_2014|
| daffodil_2017|
|sunflower_2016|
+--------------+
Run Code Online (Sandbox Code Playgroud)

我想创建2列,floweryear列。

预期产量:

+--------------+----+---------+
|          name|year|   flower|
+--------------+----+---------+
|     rose_2012|2012|     rose|
|  jasmine_2013|2013|  jasmine|
|     lily_2014|2014|     lily|
| daffodil_2017|2017| daffodil|
|sunflower_2016|2016|subflower|
+--------------+----+---------+
Run Code Online (Sandbox Code Playgroud)

year 我创建的列-

df = df.withColumn("year", substring(col("name"),-4,4))
df.show()
+--------------+----+
|          name|year|
+--------------+----+
|     rose_2012|2012|
|  jasmine_2013|2013|
|     lily_2014|2014|
| daffodil_2017|2017|
|sunflower_2016|2016|
+--------------+----+
Run Code Online (Sandbox Code Playgroud)

我不知道怎么砍最后五个字符,所以我只有花的名字。我通过调用尝试了类似的方法length,但这不起作用。

df …
Run Code Online (Sandbox Code Playgroud)

python substring pyspark

4
推荐指数
3
解决办法
5023
查看次数

通过对具有数字和字符串变量的 Dataframe 进行分组来转置

我有一个 DataFrame,我想将其转换为以下内容:

import pandas as pd
df = pd.DataFrame({'ID':[111,111,111,222,222,333],
                   'class':['merc','humvee','bmw','vw','bmw','merc'],
                   'imp':[1,2,3,1,2,1]})
print(df)
    ID   class  imp
0  111    merc    1
1  111  humvee    2
2  111     bmw    3
3  222      vw    1
4  222     bmw    2
5  333    merc    1
Run Code Online (Sandbox Code Playgroud)

期望的输出:

    ID       0        1       2
0  111    merc   humvee     bmw
1  111       1        2       3
2  222      vw      bmw
3  222       1        2
4  333    merc      
5  333       1
Run Code Online (Sandbox Code Playgroud)

我希望transpose整个数据框,但grouped by一个特定的列,ID在这种情况下,并维护行order

我的尝试:我尝试使用 …

python dataframe pandas

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

在PySpark中替换字符串

我有一个数据框,其中包含欧洲格式的数字,我已将其导入为字符串。逗号为小数,反之亦然-

from pyspark.sql.functions import regexp_replace,col
from pyspark.sql.types import FloatType
df = spark.createDataFrame([('-1.269,75',)], ['revenue'])
df.show()
+---------+
|  revenue|
+---------+
|-1.269,75|
+---------+
df.printSchema()
root
 |-- revenue: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

所需的输出: df.show()

+---------+
|  revenue|
+---------+
|-1269.75|
+---------+
df.printSchema()
root
 |-- revenue: float (nullable = true)
Run Code Online (Sandbox Code Playgroud)

我正在使用函数regexp_replace用空白替换点 -然后用逗号替换空白点,最后转换为floatType。

df = df.withColumn('revenue', regexp_replace(col('revenue'), ".", ""))
df = df.withColumn('revenue', regexp_replace(col('revenue'), ",", "."))
df = df.withColumn('revenue', df['revenue'].cast("float"))
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在下面替换时,我得到了空字符串。为什么??我在期待-1269,75

df = df.withColumn('revenue', regexp_replace(col('revenue'), ".", ""))
+-------+
|revenue|
+-------+
| …
Run Code Online (Sandbox Code Playgroud)

python replace dataframe pyspark

3
推荐指数
1
解决办法
3088
查看次数

如何在 Pandas 数据框中进行 SQL 样式聚合

我希望SQL在 Python 中有一个样式聚合。

# Example DataFrame
df = pd.DataFrame({'ID':[1,1,2,2,2],
                   'revenue':[1,3,5,1,5],
                   'month':['2012-01-01','2012-01-01','2012-03-01','2014-01-01','2012-01-01']})

print(df)
   ID       month  revenue
0   1  2012-01-01        1
1   1  2012-01-01        3
2   2  2012-03-01        5
3   2  2014-01-01        1
4   2  2012-01-01        5
Run Code Online (Sandbox Code Playgroud)

现在,我想计算出总revenue的唯一编号months和第一month每一个ID。我得到了我想要的数字,但不是列名样式,因为它们分布在两行中。

df = df.groupby(['ID']).agg({'revenue':'sum','month':['nunique','first']}).reset_index()
print(df)    
  ID revenue   month            
         sum nunique       first
0  1       4       1  2012-01-01
1  2      11       3  2012-03-01
Run Code Online (Sandbox Code Playgroud)

普通的 SQL 脚本类似于以下伪代码 -

select ID, sum(revenue) as revenue, count(month) as distinct_m, first(month) as …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas

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

使用docx python库,如何同时应用颜色和字体大小

我正在使用 python docx 库写入 .docx 文件。我想预先指定特定句子的字体大小和颜色。我的问题是我无法同时进行。我来举例说明——

from docx import Document        
from docx.shared import Pt       #Helps to specify font size
from docx.shared import RGBColor #Helps to specify font Color
document=Document()              #Instantiation
p=document.add_heading(level=0)
p.add_run('I want this sentence colored red with fontsize=22').font.size=Pt(22)  #Specifies fontsize 22
p.add_run('This line gets colored red').font.color.rgb=RGBColor(255,0,0)    #Specifies RED color
document.save('path/file.docx')
Run Code Online (Sandbox Code Playgroud)

结果: 在此处输入图片说明

我很清楚地知道,我设置的颜色Red第二句,既然有一个=Pt(22)RGBColor(255,00)这样我就可以不适用fontsize,并color同时

有没有办法同时应用这两个属性?

编辑:我想要I want this sentence colored red with fontsize=22红色的线条。

python fonts colors font-size python-docx

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

在 PySpark 中提取特定行

我有一个这样的数据框

data = [(("ID1", "A", 1)), (("ID1", "B", 5)), (("ID2", "A", 12)), 
       (("ID3", "A", 3)), (("ID3", "B", 3)), (("ID3", "C", 5)), (("ID4", "A", 10))]
df = spark.createDataFrame(data, ["ID", "Type", "Value"])
df.show()

+---+----+-----+
| ID|Type|Value|
+---+----+-----+
|ID1|   A|    1|
|ID1|   B|    5|
|ID2|   A|   12|
|ID3|   A|    3|
|ID3|   B|    3|
|ID3|   C|    5|
|ID4|   A|   10|
+---+----+-----+
Run Code Online (Sandbox Code Playgroud)

我只想提取那些只包含一种特定类型 - “A”的行(或 ID)

因此我的预期输出将包含以下行

+---+----+-----+
| ID|Type|Value|
+---+----+-----+
|ID2|   A|    1|
|ID4|   A|   10|
+---+----+-----+
Run Code Online (Sandbox Code Playgroud)

对于每个 ID 可以包含任何类型 - A、B、C 等。我想提取那些包含一个且仅包含一个类型的 ID …

python apache-spark apache-spark-sql pyspark

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

将嵌套字典转换为元组列表

我有一个dictionary-

d={'revenues':
             {
              '201907':
                      {'aaa.csv':'fdwe34x2'},
              '201906':{'ddd.csv':'e4c5q'}
             },    
   'complaints':
             {'2014':
                    {'sfdwa.csv','c2c2jh'}
             }
  }
Run Code Online (Sandbox Code Playgroud)

我想把它转换listtuples-

[
 ('revenues','201907','aaa.csv','fdwe34x2'),
 ('revenues','201906','ddd.csv','e4c5q'),
 ('complaints','2014','sfdwa.csv','c2c2jh')
]
Run Code Online (Sandbox Code Playgroud)

我尝试使用list comprehensions,但没有帮助 -

l = [(k,[(p,q) for p,q in v.items()]) for k,v in d.items()]
print(l)
    [('revenues', [('201907', {'aaa.csv': 'fdwe34x2'}), ('201906', {'ddd.csv': 'e4c5q'})]),
     ('complaints', [('2014', {'c2c2jh', 'sfdwa.csv'})])]
Run Code Online (Sandbox Code Playgroud)

有什么建议么?

python tuples dictionary-comprehension

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

将一行 DataFrame 添加到另一个 DataFrame 的优雅方式

我有两个DataFrames,其中一个是单排DataFrame。我想dataframe在较大的所有行中添加一行。我可以解决它,但我正在寻找一个更简单的解决方案:

import pandas as pd
df1 = pd.DataFrame({'C':['car'],'D':['bus']})
print(df1)
     C    D
0  car  bus

df2 = pd.DataFrame({'A':[1,2,3],'B':[8,2,0]})
print(df2)
   A  B
0  1  8
1  2  2
2  3  0
Run Code Online (Sandbox Code Playgroud)

我想将 DataFrame 线与较大的线连接起来。结果应该是。

   A  B    C    D
0  1  8  car  bus
1  2  2  car  bus
2  3  0  car  bus
Run Code Online (Sandbox Code Playgroud)

我的尝试:dummy在两个 DataFrames 中都创建了一个列并做了一个left join,但这很不雅。我相信会有更简单的解决方案。

python dataframe pandas

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