>

식당 판매 내역이 아래와 같습니다.

+----------+------------+---------+----------+
| Location | Units Sold | Revenue | Footfall |
+----------+------------+---------+----------+
| Loc - 01 |        100 | 1,150   |       85 |
+----------+------------+---------+----------+

아래 테이블 레스토랑 데이터에서 위와 가장 관련이 높은 레스토랑을 찾고 싶습니다

+----------+------------+---------+----------+
| Location | Units Sold | Revenue | Footfall |
+----------+------------+---------+----------+
| Loc - 02 |        100 | 1,250   |       60 |
| Loc - 03 |         90 | 990     |       90 |
| Loc - 04 |        120 | 1,200   |       98 |
| Loc - 05 |        115 | 1,035   |       87 |
| Loc - 06 |         89 | 1,157   |       74 |
| Loc - 07 |        110 | 1,265   |       80 |
+----------+------------+---------+----------+

파이썬이나 팬더로 어떻게 할 수 있는지 알려주세요 .. 참고 :-상관 관계는 Units Sold 측면에서 가장 일치하는/유사한 레스토랑을 의미합니다 Revenue  & Footfall .


  • 답변 # 1

    상관 관계가 최소 유클리드 거리와 같이 설명되어야하는 경우 해결책은 다음과 같습니다.

    #convert columns to numeric
    df1['Revenue'] = df1['Revenue'].str.replace(',','').astype(int)
    df2['Revenue'] = df2['Revenue'].str.replace(',','').astype(int)
    #distance of all columns subtracted by first row of first DataFrame
    dist = np.sqrt((df2['Units Sold']-df1.loc[0, 'Units Sold'])**2 + 
                   (df2['Revenue']- df1.loc[0, 'Revenue'])**2 + 
                   (df2['Footfall']- df1.loc[0, 'Footfall'])**2)
    print (dist)
    0    103.077641
    1    160.390149
    2     55.398556
    3    115.991379
    4     17.058722
    5    115.542200
    dtype: float64
    #get index of minimal value and select row of second df
    print (df2.loc[[dist.idxmin()]])
       Location  Units Sold  Revenue  Footfall
    4  Loc - 06          89     1157        74
    
    

  • 답변 # 2

    이 작업을 수행하는 더 좋은 방법 일 수 있지만 이것이 효과가 있다고 생각합니다. 매우 장황하므로 코드를 깨끗하고 읽기 쉽게 유지하려고 노력했습니다.

    먼저이 게시물에서 자체 정의 된 numpy 함수를 사용하도록합니다.

    import numpy as np
    import pandas as pd
    
    def find_nearest(array, value):
        array = np.asarray(array)
        idx = (np.abs(array - value)).argmin()
        return array[idx]
    
    

    그런 다음 데이터 프레임 배열을 사용하여 첫 번째 데이터 프레임의 값을 전달하여 가장 일치하는 것을 찾으십시오.

    us = find_nearest(df2['Units Sold'],df['Units Sold'][0])
    ff = find_nearest(df2['Footfall'],df['Footfall'][0])
    rev = find_nearest(df2['Revenue'],df['Revenue'][0])
    print(us,ff,rev,sep=',')
    100,87,1157
    
    

    그런 다음 세 가지 조건을 모두 갖춘 데이터 프레임을 반환합니다

       new_ df = (df2.loc[
        (df2['Units Sold'] == us) |
        (df2['Footfall'] == ff) |
        (df2['Revenue'] == rev)])
    
    

    우리에게 :

       Location    Units Sold  Revenue Footfall
    0   Loc - 02    100         1250    60
    3   Loc - 05    115         1035    87
    4   Loc - 06    89          1157    74
    
    

  • 답변 # 3

    데이터 수정

    숫자 열의 경우. 나는 이것을 너무 많이 일반화했다. 또한 인덱스를 'Location' 로 설정했습니다.  열

    def fix(d):
        d.update(
            d.astype(str).replace(',', '', regex=True)
             .apply(pd.to_numeric, errors='ignore')
        )
        d.set_index('Location', inplace=True)
    fix(df1)
    fix(df2)
    
    
    <시간> 맨해튼 거리
    df2.loc[[df2.sub(df1.loc['Loc - 01']).abs().sum(1).idxmin()]]
              Units Sold Revenue  Footfall
    Location                              
    Loc - 06          89    1157        74
    
    
    유클리드 거리
    df2.loc[[df2.sub(df1.loc['Loc - 01']).pow(2).sum(1).pow(.5).idxmin()]]
              Units Sold Revenue  Footfall
    Location                              
    Loc - 06          89    1157        74
    
    

  • 이전 visual studio - 이전 커밋의 실제 코드 파일 (C #, Java 등)을 수정합니까 (git 사용)?
  • 다음 python - saveFrame에서 NullPointerException 오류가 발생 함