Series와 DataFrame을 병합하는 방법
당신에 대한 정보를 찾고 여기 온 경우 을 병합하는 방법
DataFrame
과Series
인덱스에 , 봐주세요 이 답변 .OP의 원래 의도는 시리즈 요소를 다른 DataFrame에 열로 할당하는 방법을 묻는 것이 었 습니다 . 이것에 대한 답을 알고 싶다면 EdChum 이 받아 들인 답 을보십시오.
내가 생각 해낼 수있는 최선은
df = pd.DataFrame({'a':[1, 2], 'b':[3, 4]}) # see EDIT below
s = pd.Series({'s1':5, 's2':6})
for name in s.index:
df[name] = s[name]
a b s1 s2
0 1 3 5 6
1 2 4 5 6
누구든지 더 나은 구문 / 빠른 방법을 제안 할 수 있습니까?
내 시도 :
df.merge(s)
AttributeError: 'Series' object has no attribute 'columns'
과
df.join(s)
ValueError: Other Series must have a name
편집 게시 된 처음 두 답변은 내 질문에 문제를 강조 했으므로 다음을 사용하여 구성하십시오 df
.
df = pd.DataFrame({'a':[np.nan, 2, 3], 'b':[4, 5, 6]}, index=[3, 5, 6])
최종 결과로
a b s1 s2
3 NaN 4 5 6
5 2 5 5 6
6 3 6 5 6
시리즈에서 데이터 프레임을 구성한 다음 데이터 프레임과 병합 할 수 있습니다. 따라서 데이터를 값으로 지정하지만 길이를 곱하고 열을 인덱스로 설정하고 left_index 및 right_index에 대한 매개 변수를 True로 설정합니다.
In [27]:
df.merge(pd.DataFrame(data = [s.values] * len(s), columns = s.index), left_index=True, right_index=True)
Out[27]:
a b s1 s2
0 1 3 5 6
1 2 4 5 6
시리즈에서 구성된 df의 색인이 df의 색인을 사용하기를 원하는 상황에 대해 편집 하면 다음을 수행 할 수 있습니다.
df.merge(pd.DataFrame(data = [s.values] * len(df), columns = s.index, index=df.index), left_index=True, right_index=True)
이것은 인덱스가 길이와 일치한다고 가정합니다.
업데이트
v0.24.0부터 Series의 이름이 지정된 한 DataFrame 및 Series에서 병합 할 수 있습니다.
df.merge(s.rename('new'), left_index=True, right_index=True)
# If series is already named,
# df.merge(s, left_index=True, right_index=True)
요즘에는 to_frame ()을 사용하여 Series를 DataFrame으로 간단히 변환 할 수 있습니다 . 따라서 (인덱스에 가입하는 경우) :
df.merge(s.to_frame(), left_index=True, right_index=True)
한 가지 방법은 다음과 같습니다.
df.join(pd.DataFrame(s).T).fillna(method='ffill')
여기서 일어나는 일을 분석하려면 ...
pd.DataFrame(s).T
s
다음과 같은 1 행 DataFrame을 만듭니다 .
s1 s2
0 5 6
다음 join
으로이 새 프레임을 다음으로 연결합니다 df
.
a b s1 s2
0 1 3 5 6
1 2 4 NaN NaN
마지막으로 NaN
인덱스 1 의 값 fillna
은 forward-fill ( ffill
) 인수를 사용하여 열의 이전 값 으로 채워집니다 .
a b s1 s2
0 1 3 5 6
1 2 4 5 6
를 사용하지 않으려면 에서 생성 된 DataFrame의 행을 반복하는 fillna
데 사용할 pd.concat
수 있습니다 s
. 이 경우 일반적인 솔루션은 다음과 같습니다.
df.join(pd.concat([pd.DataFrame(s).T] * len(df), ignore_index=True))
다음은 편집 된 질문에서 제기 된 인덱싱 문제를 해결하기위한 또 다른 솔루션입니다.
df.join(pd.DataFrame(s.repeat(len(df)).values.reshape((len(df), -1), order='F'),
columns=s.index,
index=df.index))
s
값을 반복하고 모양을 변경 ( 'Fortran'순서 지정)하고 적절한 열 이름과 인덱스를 전달하여 DataFrame으로 변환됩니다. 이 새 DataFrame은 df
.
다음과 같이 데이터 프레임을 설정하는 것이 좋습니다 (자동 인덱싱).
df = pd.DataFrame({'a':[np.nan, 1, 2], 'b':[4, 5, 6]})
then you can set up your s1 and s2 values thus (using shape() to return the number of rows from df):
s = pd.DataFrame({'s1':[5]*df.shape[0], 's2':[6]*df.shape[0]})
then the result you want is easy:
display (df.merge(s, left_index=True, right_index=True))
Alternatively, just add the new values to your dataframe df:
df = pd.DataFrame({'a':[nan, 1, 2], 'b':[4, 5, 6]})
df['s1']=5
df['s2']=6
display(df)
Both return:
a b s1 s2
0 NaN 4 5 6
1 1.0 5 5 6
2 2.0 6 5 6
If you have another list of data (instead of just a single value to apply), and you know it is in the same sequence as df, eg:
s1=['a','b','c']
then you can attach this in the same way:
df['s1']=s1
returns:
a b s1
0 NaN 4 a
1 1.0 5 b
2 2.0 6 c
You can easily set a pandas.DataFrame column to a constant. This constant can be an int such as in your example. If the column you specify isn't in the df, then pandas will create a new column with the name you specify. So after your dataframe is constructed, (from your question):
df = pd.DataFrame({'a':[np.nan, 2, 3], 'b':[4, 5, 6]}, index=[3, 5, 6])
You can just run:
df['s1'], df['s2'] = 5, 6
You could write a loop or comprehension to make it do this for all the elements in a list of tuples, or keys and values in a dictionary depending on how you have your real data stored.
참고URL : https://stackoverflow.com/questions/26265819/how-to-merge-a-series-and-dataframe
'Programing' 카테고리의 다른 글
JQuery로 테이블 행 확장 / 축소 (0) | 2020.11.30 |
---|---|
웹 사이트 IIS HRESULT를 시작할 수 없음 : 0x80070020) (0) | 2020.11.30 |
Xcode 내보내기 / 업로드 오류 : 세션이 만료되었습니다. (0) | 2020.11.30 |
JShint의 ES6-.jshintrc에 esversion이 있지만 여전히 경고가 표시됨 (Atom 사용) (0) | 2020.11.30 |
Rails 애플리케이션을 초기 데이터로 채우는 방법 (및 여부) (0) | 2020.11.30 |