반응형

출처 : https://stackoverflow.com/questions/39993238/vlookup-between-2-pandas-dataframes

2개의 Pandas 데이터프레임 간에 vlookup

다음처럼 2개의 Pandas 데이터 프레임이 있습니다.

DF1:

Security     ISIN
ABC           I1 
DEF           I2
JHK           I3
LMN           I4
OPQ           I5

DF2:

ISIN      Value
 I2        100
 I3        200
 I5        300

저는 다음처럼 보이는 결국 세번째 데이터프레임을 얻고 싶습니다.

DF3:

Security   Value
 DEF       100
 JHK       200
 OPQ       300

2개의 답변 중 1개

당신은 기본으로 inner join에 의해 merge를 사용할 수 있습니다. how=inner는 제외되고 두 DataFrames에서 공통 열만 있다면, 당신은 파라미터 on=ISIN을 제외할 수 있습니다.

df3 = pd.merge(df1, df2)
#ISIN 열 제거
df3.drop('ISIN', axis=1, inplace=True)
print (df3)
  Security  Value
0      DEF    100
1      JHK    200
2      OPQ    300

또는 df1로부터 Series에 의한 ISIN 열을 map을 호출할 수 있습니다.

print (df1.set_index('ISIN')['Security'])
ISIN
I1    ABC
I2    DEF
I3    JHK
I4    LMN
I5    OPQ
Name: Security, dtype: object

#df2를 복사하여 새로운 df를 생성
df3 = df2.copy()
df3['Security'] = df3.ISIN.map(df1.set_index('ISIN')['Security'])
#ISIN열을 없앰
df3.drop('ISIN', axis=1, inplace=True)
#열의 순서를 변경
df3 = df3[['Security','Value']]
print (df3)
  Security  Value
0      DEF    100
1      JHK    200
2      OPQ    30
반응형
반응형

출처 : https://stackoverflow.com/questions/19231871/convert-unix-time-to-readable-date-in-pandas-dataframe

Unix 시간을 pandas dataframe에서 읽을 수 있는 날짜로 변환하기

저는 Unix 시간으로 가격이 포함된 dataframe이 있습니다. 사람이 읽을 수 있는 날짜로 표시되도록 index 열을 변환하고 싶습니다.

예를 들어 index 열에서 date1349633705가 있지만 그것이 10/07/2012(또는 적어도 10/07/2012 18:15)로 보여지길 원합니다.

다음 구문에서 내가 작업 중인 코드와 이미 시도한 코드는 다음과 같습니다.

import json
import urllib2
from datetime import datetime
response = urllib2.urlopen('http://blockchain.info/charts/market-price?&format=json')
data = json.load(response)   
df = DataFrame(data['values'])
df.columns = ["date","price"]
#convert dates 
df.date = df.date.apply(lambda d: datetime.strptime(d, "%Y-%m-%d"))
df.index = df.date

보시다시피 df.date = df.date.apply(lambda d: datetime.strptime (d, "%Y-%m-%d")) 여기에서 문자열이 아닌 정수로 작동하지 않습니다. 나는 datetime.date.fromtimestamp를 사용해야 한다고 생각하지만 이것을 df.date 전체에 적용하는 방법을 잘 모르겠습니다.

감사합니다.


4 개의 답변 중 1 개의 답변만 추려냄.

다음은 epoch 이후 초단위로 보일 것입니다.

In [20]: df = DataFrame(data['values'])

In [21]: df.columns = ["date","price"]

In [22]: df
Out[22]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 358 entries, 0 to 357
Data columns (total 2 columns):
date     358  non-null values
price    358  non-null values
dtypes: float64(1), int64(1)

In [23]: df.head()
Out[23]: 
         date  price
0  1349720105  12.08
1  1349806505  12.35
2  1349892905  12.15
3  1349979305  12.19
4  1350065705  12.15
In [25]: df['date'] = pd.to_datetime(df['date'],unit='s')

In [26]: df.head()
Out[26]: 
                 date  price
0 2012-10-08 18:15:05  12.08
1 2012-10-09 18:15:05  12.35
2 2012-10-10 18:15:05  12.15
3 2012-10-11 18:15:05  12.19
4 2012-10-12 18:15:05  12.15

In [27]: df.dtypes
Out[27]: 
date     datetime64[ns]
price           float64
dtype: object
반응형
반응형

출처 : https://stackoverflow.com/questions/17097643/search-for-does-not-contain-on-a-dataframe-in-pandas

Pandas 데이터프레임에서 "포함되지 않은 것" 찾기

저는 몇가지 검색을 수행했지만 df["col"].str.contains(word)로 데이터프레임을 제외하는 방법을 알 수 없습니다. 하지만, 저는 contains를 반대로 수행할 방법, 즉 데이터프레임의 여집합을 구하는 방법이 있는지 궁금합니다. 예: !(df["col"].str.contains(word)) 의 효과

DataFrame 방법을 통해 할 수 있는 방법이 있을까요?


6개의 답변

(불리언 데이터에서 not처럼 실행하는) 반전(invert, ~) 연산자를 사용할 수 있습니다.

new_df = df[~df["col"].str.contains(word)]

new_df는 RHS에 의해 복사되는 곳입니다.

contains는 정규 표현식도 받아 들입니다.


만약 위에서 ValueError가 발생하면 그 이유는 여러 타입이 섞인 데이터 타입이라 그렇고 na=False를 사용합니다.

new_df = df[~df["col"].str.contains(word, na=False)]

또는

new_df = df[df["col"].str.contains(word) == False]

를 사용합니다.

반응형
반응형

출처 : https://bitdatatechie.com/2019/09/13/spark-journal-return-multiple-dataframes-from-a-scala-method/

Spark Journal: Scala 메소드로부터 여러 개의 dataframe을 리턴

지금까지, 저는 Spark에 한해서 글을 남기는 데 집중하였지만, Spark Framework를 사용할 때 사용되는 주요 언어 중 하나는 당신이 알 듯이 Scala입니다. 흥미로운 사용 사례를 보여주기 위해 Spark API와 Scala 언어 모두 사용할 것입니다.

이번 작업은 Scala 메소드로부터 여러 개의 dataframe을 리턴하는 것입니다. Int, String, Dataframe일 수 있는 리턴 값이 있을 때 메소드의 리턴 부분에 1개의 값만으로 이 작업을 해왔습니다.
저의 동료와 Architect는 이를 매우 쉽게 할 수 있는 다른 옵션을 저에게 보여주었고 도움이 되었습니다.

더 읽기 전에 StackOverflow의 이 게시물을 살펴 보는 것이 좋습니다. 이 방법은 Scala에서 List와 Tuple의 개념적 차이를 분명히 하는 데 도움이 됩니다.

접근 1
리턴 값으로 List를 사용

import org.apache.spark.sql.DataFrame

def returMultipleDf  : List[DataFrame] = {
    val dataList1 = List((1,"abc"),(2,"def"))
    val df1 = dataList1.toDF("id","Name")

    val dataList2 = List((3,"ghi","home"),(4,"jkl","ctrl"))
    val df2 = dataList2.toDF("id","Name","Type")

    List(df1, df2)

}

val dfList = returMultipleDf 
val dataFrame1 = dfList(0)
val dataFrame2 = dfList(1)

dataFrame2.show

+---+----+----+
| id|Name|Type|
+---+----+----+
|  3| ghi|home|
|  4| jkl|ctrl|
+---+----+----+

접근 2
리턴 값으로 Tuple을 사용

import org.apache.spark.sql.DataFrame

def returMultipleDf : (DataFrame, DataFrame) = {
    val dataList1 = List((1,"abc"),(2,"def"))
    val df1 = dataList1.toDF("id","Name")

    val dataList2 = List((3,"ghi","home"),(4,"jkl","ctrl"))
    val df2 = dataList2.toDF("id","Name","Type")

    (df1, df2)

}

val (df1, df2) = returMultipleDf


df2.show

+---+----+----+
| id|Name|Type|
+---+----+----+
|  3| ghi|home|
|  4| jkl|ctrl|
+---+----+----+
반응형
반응형

출처

https://stackoverflow.com/questions/30674376/apache-spark-get-elements-of-row-by-name


Apache Spark: Row의 element값을 이름으로 얻기

Apache Spark(저는 Scala 인터페이스를 사용합니다)의 DataFrame 객체에서, 객체를 순회한다고 했을 때 이름으로 값들을 추출하는 방법이 있을까요? 저는 정말 어색한 방법으로 이 작업을 했습니다.

def foo(r: Row) = {
  val ix = (0 until r.schema.length).map( i => r.schema(i).name -> i).toMap
  val field1 = r.getString(ix("field1"))
  val field2 = r.getLong(ix("field2"))
  ...
}
dataframe.map(foo)

저는 더 좋은 방법이 있을 것이라 생각합니다. 제 작업은 매우 장황한 방법입니다. 이는 추가 구조를 만들어야 하고 명시적으로 type도 알아야 합니다. 만약 타입이 틀리면 프로그램은 compile-time 오류보다 실행시 exception이 발생할 것입니다.

1개의 답변만 발췌

당신은 org.apache.spark.sql.Row로부터 "getAs"를 사용할 수 있습니다.

r.getAs("field1")
r.getAs("field2")

getAs(java.lang.String fieldName) 관해 링크를 클릭하시면 더 아실 수 있습니다.

반응형

+ Recent posts