Я хочу преобразовать строку в столбец

К сожалению, эта первая версия BottomNavigationView имеет множество ограничений. И пока вы не можете удалить заголовки, используя API-интерфейс поддержки. Поэтому, чтобы решить это ограничение, пока Google не реализует его, вы можете сделать (используя отражение):

1. Задайте заголовки пустыми из файла bottom_navigation_menu.xml.

2. Расширяет представление BottomNavigationView:

    public class MyBottomNavigationView extends BottomNavigationView {

      public MyBottomNavigationView(Context context, AttributeSet attrs) {
          super(context, attrs);
          centerMenuIcon();
      }

      private void centerMenuIcon() {
          BottomNavigationMenuView menuView = getBottomMenuView();

          if (menuView != null) {
              for (int i = 0; i < menuView.getChildCount(); i++) {
                BottomNavigationItemView menuItemView = (BottomNavigationItemView) menuView.getChildAt(i);

                AppCompatImageView icon = (AppCompatImageView) menuItemView.getChildAt(0);

                FrameLayout.LayoutParams params = (LayoutParams) icon.getLayoutParams();
                params.gravity = Gravity.CENTER;

                menuItemView.setShiftingMode(true);
              }
          }
      }

      private BottomNavigationMenuView getBottomMenuView() {
          Object menuView = null;
          try {
              Field field = BottomNavigationView.class.getDeclaredField("mMenuView");
              field.setAccessible(true);
              menuView = field.get(this);
          } catch (NoSuchFieldException | IllegalAccessException e) {
              e.printStackTrace();
          }

          return (BottomNavigationMenuView) menuView;
      }
    }

3. Добавьте к layout.xml этот customView

Для получения дополнительной информации я реализовал это на Github

-1
задан yatu 28 March 2019 в 13:38
поделиться

3 ответа

Вы хотите развернуть свой фрейм данных. Вот один из способов использования pivot_table :

g = df.groupby('ID').cumcount().add(1)
df.pivot_table(index='ID', columns=g).droplevel(0, axis=1).add_prefix('Phone Number ')

      Phone Number 1  Phone Number 2
ID                                
1         234444.0        989898.0
2          30909.0             NaN

Для версий панд ниже 0,24,0 :

g = df.groupby('ID').cumcount().add(1)
df_ = df.pivot_table(index = 'ID', columns=g)
df_.columns = df_.columns.droplevel(0)
df_.add_prefix('Phone Number ')

    Phone Number 1  Phone Number 2
ID                                
1         234444.0        989898.0
2          30909.0             NaN
0
ответ дан yatu 28 March 2019 в 13:38
поделиться

импорт панд в виде pd

df = pd.DataFrame([['1','2345'],['1','7890'],['2','1580']], columns = ['ID','Phone Number'])


d2 = df.groupby('ID')
new_df = pd.DataFrame()
for i in range(len(d2)):
    new_df = pd.concat([new_df, d2.nth(i).add_suffix(i+1)], axis=1) 

new_df = new_df.rename_axis('ID').reset_index()

Вывод:

print(new_df)
  ID Phone Number1 Phone Number2
0  1          2345          7890
1  2          1580           NaN
0
ответ дан chitown88 28 March 2019 в 13:38
поделиться

Решения для сводного столбца Phone Number:

g = df.groupby('ID').cumcount().add(1)

df1 = df.set_index([g, 'ID'])['Phone Number'].unstack().add_prefix('Phone Number ')
print (df1)
ID  Phone Number 1  Phone Number 2
1         234444.0         30909.0
2         989898.0             NaN

Или:

df['idx'] = df.groupby('ID').cumcount().add(1)
df1 = df.pivot('idx', 'ID', 'Phone Number').add_prefix('Phone Number ')
print (df1)
ID   Phone Number 1  Phone Number 2
idx                                
1          234444.0         30909.0
2          989898.0             NaN

Или:

s = df.groupby('ID')['Phone Number'].apply(list)
df1 = pd.DataFrame(s.values.tolist(), index=s.index).add_prefix('Phone Number ')
print (df1)
    Phone Number 0  Phone Number 1
ID                                
1           234444        989898.0
2            30909             NaN

Последнее, если требуется индекс для столбца для Решения выше:

df1 = df1.rename_axis(None, axis=1).rename_axis('ID').reset_index()
print (df1)
   ID  Phone Number 1  Phone Number 2
0   1        234444.0         30909.0
1   2        989898.0             NaN

Решения для нескольких столбцов и необходимо обрабатывать их одинаково:

print (df)
   ID  Phone Number Name  Val
0   1        234444    A   10
1   1        989898    B    4
2   2         30909    C    6

g = df.groupby('ID').cumcount().add(1)

df = df.set_index([g, 'ID']).unstack()
df.columns = [f'{a}{b}' for a, b in df.columns]
df = df.rename_axis('ID').reset_index()
print (df)
   ID  Phone Number1  Phone Number2 Name1 Name2  Val1  Val2
0   1       234444.0        30909.0     A     C  10.0   6.0
1   2       989898.0            NaN     B   NaN   4.0   NaN

Или:

df1 = df.groupby('ID').agg(list)
comb = [pd.DataFrame(df1[x].values.tolist(), index=df1.index) for x in df1.columns]
df = pd.concat(comb, axis=1, keys=df1.columns)
df.columns = [f'{a}{b}' for a, b in df.columns]
df = df.rename_axis('ID').reset_index()
print (df)
   ID  Phone Number0  Phone Number1 Name0 Name1  Val0  Val1
0   1         234444       989898.0     A     B    10   4.0
1   2          30909            NaN     C  None     6   NaN
0
ответ дан jezrael 28 March 2019 в 13:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: