Programing

Series와 DataFrame을 병합하는 방법

lottogame 2020. 11. 30. 07:44
반응형

Series와 DataFrame을 병합하는 방법


당신에 대한 정보를 찾고 여기 온 경우 을 병합하는 방법 DataFrameSeries인덱스에 , 봐주세요 이 답변 .

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).Ts다음과 같은 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

반응형